[我知道在其他语言中,例如C / C ++,您将返回类似SUCCESS的值,该值将向调用方法指示该方法成功返回或失败。
在C#中是否有一种“不错”的方法无需SUCCESS返回变量?我想到了一个例外,但是我不确定该如何实现。您是否可以通过自己的错误消息抛出自定义异常?
示例代码将不胜感激。
先谢谢您。
您可以从Exception派生自己的异常。
您可以返回布尔值或某些数字约定。
在C#中,如果要返回成功/失败,而且要返回产品输出,则输出参数比指针要容易使用一点。
我倾向于例外情况的例外。逻辑事物的逻辑返回。即不要使用异常来控制程序操作。如果文件操作意外失败,则引发异常。如果应用程序需要查找文件,并且通常希望有时找不到它作为正常操作,则我不希望调用方捕获异常,而是简单地返回布尔值并选择通过应用程序的适当逻辑路径。
1)我不建议使用异常,除非失败是“异常”。例如,它失败了,这意味着需要处理一些事情。它们比“ false”类型返回慢。
2)为什么要避免返回值?您必须没有返回值吗?
您是否在引用bool
数据类型?
函数定义示例:
public static bool DoSomething()
{
if ( some || condition )
return true;
else
return false;
}
用法示例:
public static void main()
{
if ( DoSomething() )
Console.WriteLine( "SUCCESS" );
else
Console.WriteLine( "FAILURE" );
}
如果您的方法是void
,则它返回而没有引发异常的事实被认为是成功。
如果您的方法不是void,则特定的返回值可能会解释为不成功的执行,例如:
bool
方法返回false
null
的任何引用类型返回方法请勿将异常用于流控制或“成功”的指示。
如果您除了返回参数之外还希望获得成功或失败的指示器,则可以在方法签名中使用out bool
参数。
public SomeObject DoingSomethingHere(out bool success)
{
}
if (!success)
{
// some compensating action
}
听起来您想表明一个方法如果不使用返回值或异常就无法成功完成。 [out bool
参数呢?
public void Execute(out bool success) {
try {
//...
success = true;
} catch {
success = false
}
}
我会不建议您这样做,但由于您询问...。
对于某些类型的故障,自定义异常无疑是一个好方法。一种简单的方法是在一个公共库中创建一个DomainException
类(或您想要为应用程序的问题域调用的任何类,等等),该类库继承自Exception
并添加您认为将是的任何特定信息。对于自定义域异常很有用。 (也许是特定的代码,也许是有关当前环境的信息,这些信息可能在标准Exception
等中不可用,等等)
不抛出异常将是我想到的方式...
您可以返回状态变量,例如枚举,整数或布尔值。问题在于调用者必须知道不同的返回值意味着什么。有时为true表示成功,有时表示有错误。另外,如果调用失败,直接调用者可能不知道该怎么办,因为每个方法都失败了,因此要求“泡沫化”,因为调用失败了。
Try-throw-catch是用于处理您可能会失败的事情并控制执行流程(如果/何时执行的话:)的转到模式”
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);
}