我知道像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