我知道像C/C++这样的其他语言,你会返回一个像SUCCESS这样的值,它会告诉调用方法该方法返回成功或失败。如何显示该方法返回成功或失败,而无需在C#中返回值?
有没有一种“很好”的方式在C#中执行此操作,而无需SUCCESS返回变量?抛出一个异常,但我不知道如何实现这一点。有自定义的异常,你可以抛出自己的错误信息?
示例代码将不胜感激。
预先感谢您。
我知道像C/C++这样的其他语言,你会返回一个像SUCCESS这样的值,它会告诉调用方法该方法返回成功或失败。如何显示该方法返回成功或失败,而无需在C#中返回值?
有没有一种“很好”的方式在C#中执行此操作,而无需SUCCESS返回变量?抛出一个异常,但我不知道如何实现这一点。有自定义的异常,你可以抛出自己的错误信息?
示例代码将不胜感激。
预先感谢您。
您可以从异常中派生自己的异常。
您可以返回一个bool或一些数字约定。
在C#中,如果您想返回成功/失败,而且还有产品输出,那么您的输出参数比指针更容易使用。
我倾向于例外的例外情况。逻辑事物的逻辑回报。即不要使用例外来控制程序操作。如果文件操作意外失败,则抛出异常。如果应用程序需要查找一个文件,并且通常期望不会像普通操作那样找到它,我不希望调用者捕捉到异常,而是简单地返回一个bool并通过应用程序选择合适的逻辑路径。
你是指bool
数据类型?函数定义的
例子:
public static void main()
{
if (DoSomething())
Console.WriteLine("SUCCESS");
else
Console.WriteLine("FAILURE");
}
这听起来像你想表明一个方法没有成功完成,而无需使用一个返回值,或异常:
public static bool DoSomething()
{
if (some || condition)
return true;
else
return false;
}
使用示例。那么out bool
参数怎么样?
public void Execute(out bool success) {
try {
//...
success = true;
} catch {
success = false
}
}
我不建议这样做,但既然你问....
如果你的方法是void
,那么它返回,没有抛出异常被认为是成功的事实。
如果你的方法是不是void其他的东西,然后到特定返回值可以被解释为不成功的执行,例如:
bool
方法返回false
null
1)我不会推荐使用异常,除非失败是“例外”。例如,它失败了,这意味着需要处理的东西。它们比“虚假”类型的回报慢。
2)为什么你想避免返回值?你必须有没有返回值?
不是抛出一个异常,将是我脑海的方式......
基本上有办法,你可以得到一个消息出来的功能
但是我会抛出一个异常,如果事情发生(意外)错误。如果我希望某些东西不能始终工作,请使用返回值。
心连心
马里奥
不要使用流量控制或“成功”的指示例外。
如果您希望除了返回参数之外还有成功或失败的指示符,您可以在方法签名中使用out bool
参数。
public SomeObject DoingSomethingHere(out bool success)
{
}
if (!success)
{
// some compensating action
}
作为成功的一个指标,例外情况是一个糟糕的选择,但它们是特殊情况(即意外失败)的绝佳指标。 – Mark 2011-03-31 20:27:05
@Mark - 当然。我没有建议我们不应该使用例外。 :) – 2011-03-31 21:52:37
对于某些类型的故障,自定义异常当然是一个好方法。一个简单的方法是创建一个DomainException
类(或任何你想要为你的应用程序的问题域调用它),在一个公共库中,它从Exception
继承,并添加你认为对于一个自定义有用的特定信息域例外。 (也许特定代码,有关当前环境可能不是标准的Exception
是可用的,也许等信息)
从那里,你可以创建一个从继承更具体的例外,如DataIntegrityException
两者皆可抛,如果例如,一种方法接收技术级别上有意义的输入,但违反了自定义业务验证规则等。
您可以返回状态变量,例如枚举,整数或布尔值。问题是调用者必须知道不同的返回值是什么意思。有时真的意味着它是成功的,有时意味着有错误。另外,如果呼叫失败,直接呼叫者可能不知道该怎么做,因为每个方法因为其呼叫而失败,所以要求失败“冒泡”。
尝试抛出,美中不足的是去到处理您知道可能会失败的事情,并控制执行流程模式,如果/当它的作用:
public void MightFail()
{
//obviously your code will do something a little more meaningful
if(new Random().Next(2) == 0) throw new Exception("I failed");
return;
}
public void RunRiskyMethod()
{
var failures = 0;
var successes = 0;
var totalRuns = 0;
for(var i=1;i<10000;i++)
{
try
{
MightFail();
//if the previous line throws an exception, the below lines will not execute
successes++;
Console.WriteLine("Success!");
}
catch(Exception) //I didn't name the exception because we don't need its info.
{
//These lines ONLY execute if an exception was thrown from within the try block
failures++;
Console.WriteLine("Failure!");
}
finally
{
//this code ALWAYS executes, even if an exception is thrown and not caught
totalRuns++;
}
}
Console.WriteLine(String.Format("{0} Successes, {1} Failures.", successes, failures);
}
我想你可能需要去在基础知识再多一点。你有没有使用“C#自定义例外”来看看你得到了什么? – Crisfole 2011-03-31 18:55:16