2011-03-31 81 views
1

我知道像C/C++这样的其他语言,你会返回一个像SUCCESS这样的值,它会告诉调用方法该方法返回成功或失败。如何显示该方法返回成功或失败,而无需在C#中返回值?

有没有一种“很好”的方式在C#中执行此操作,而无需SUCCESS返回变量?抛出一个异常,但我不知道如何实现这一点。有自定义的异常,你可以抛出自己的错误信息?

示例代码将不胜感激。

预先感谢您。

+1

我想你可能需要去在基础知识再多一点。你有没有使用“C#自定义例外”来看看你得到了什么? – Crisfole 2011-03-31 18:55:16

回答

1

您可以从异常中派生自己的异常。

您可以返回一个bool或一些数字约定。

在C#中,如果您想返回成功/失败,而且还有产品输出,那么您的输出参数比指针更容易使用。

我倾向于例外的例外情况。逻辑事物的逻辑回报。即不要使用例外来控制程序操作。如果文件操作意外失败,则抛出异常。如果应用程序需要查找一个文件,并且通常期望不会像普通操作那样找到它,我不希望调用者捕捉到异常,而是简单地返回一个bool并通过应用程序选择合适的逻辑路径。

2

你是指bool数据类型?函数定义的

例子:

public static void main() 
{ 
    if (DoSomething()) 
     Console.WriteLine("SUCCESS"); 
    else 
     Console.WriteLine("FAILURE"); 
} 
1

这听起来像你想表明一个方法没有成功完成,而无需使用一个返回值,或异常:

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 
     } 
} 

建议这样做,但既然你问....

2

如果你的方法是void,那么它返回,没有抛出异常被认为是成功的事实。

如果你的方法是不是void其他的东西,然后到特定返回值可以被解释为不成功的执行,例如:

  • bool方法返回false
  • 任何引用类型返回方法返回null
4

1)我不会推荐使用异常,除非失败是“例外”。例如,它失败了,这意味着需要处理的东西。它们比“虚假”类型的回报慢。

2)为什么你想避免返回值?你必须有没有返回值?

1

不是抛出一个异常,将是我脑海的方式......

基本上有办法,​​你可以得到一个消息出来的功能

  • 一些回报
  • 使用一个出可变
  • 抛出异常
  • 设置一个变种的类别的另一成员

但是我会抛出一个异常,如果事情发生(意外)错误。如果我希望某些东西不能始终工作,请使用返回值。

心连心

马里奥

2

不要使用流量控制或“成功”的指示例外。

如果您希望除了返回参数之外还有成功或失败的指示符,您可以在方法签名中使用out bool参数。

public SomeObject DoingSomethingHere(out bool success) 
{ 


} 
if (!success) 
{ 
    // some compensating action 
} 
+0

作为成功的一个指标,例外情况是一个糟糕的选择,但它们是特殊情况(即意外失败)的绝佳指标。 – Mark 2011-03-31 20:27:05

+0

@Mark - 当然。我没有建议我们不应该使用例外。 :) – 2011-03-31 21:52:37

1

对于某些类型的故障,自定义异常当然是一个好方法。一个简单的方法是创建一个DomainException类(或任何你想要为你的应用程序的问题域调用它),在一个公共库中,它从Exception继承,并添加你认为对于一个自定义有用的特定信息域例外。 (也许特定代码,有关当前环境可能不是标准的Exception是可用的,也许等信息)

从那里,你可以创建一个从继承更具体的例外,如DataIntegrityException两者皆可抛,如果例如,一种方法接收技术级别上有意义的输入,但违反了自定义业务验证规则等。

0

您可以返回状态变量,例如枚举,整数或布尔值。问题是调用者必须知道不同的返回值是什么意思。有时真的意味着它是成功的,有时意味着有错误。另外,如果呼叫失败,直接呼叫者可能不知道该怎么做,因为每个方法因为其呼叫而失败,所以要求失败“冒泡”。

尝试抛出,美中不足的是去到处理您知道可能会失败的事情,并控制执行流程模式,如果/当它的作用:

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); 
} 
相关问题