2011-03-31 84 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); 
} 
相關問題