2011-01-23 25 views
1

我有一個控制流問題。在我的公司,我們創建了很多bool方法,如果出現錯誤,將返回false。例如:異常與C#中的「if」#

public bool Foo(string path, string fileName, ref string error) 
{ 
    if (path == null) 
    { 
     error = "path is null"; 
     return false; 
    } 
    path += fileName; 
    return true; 
} 

正如你可以看到它的醜陋。我想用這樣的例外:

public voidFoo(string path, string fileName, ref string error) 
{ 
    if (path == null) 
    { 
     throw new SomeException("Path is null."); 
    } 
    path += fileName; 
    return true; 
} 

但我們擔心的開銷。我們應該嗎?

+1

什麼你真的想要在第二個例子中刪除醜陋的`error`參數。 – 2011-01-23 12:06:13

+2

夥計們,我們真的需要這麼多的答案,說完全一樣的東西嗎? – 2011-01-23 14:13:39

回答

3

如果例外情況是而不是被拋出,那麼try...catch的開銷可以忽略不計。因此,經驗法則是:

  • 如果異常可能被拋出(即,如果path == null是「支持」的情況下),使用返回值。
  • 如果例外是不太可能,即如果path == null通常只發生在使用您的函數的開發人員犯了錯誤,則使用例外。
1

如何例外是否發生這種情況?拋出和捕獲異常會招致一些開銷,而您可能不願意在一般情況下使用這些開銷。

從文體上講,使用流控制異常是令人不悅的,無論是出於性能和理解的原因。如果這是(無雙關)特例,我會使用例外。如果性能是關鍵的(你應該測量這個 - premature optimisation being the root of all evil等),那麼更優化的解決方案就是使用返回值。

這種情況的頭痛之處在於可以忽略或誤用返回值(通常爲falsenull)。

2

您不應該將異常用作流控制的一種形式。

在一般情況下,拋出異常比檢查故障值更昂貴的 - 在這種情況下,如果path不應該是假的,並預計始終存在,空path是一個特殊情況,異常應該被拋出。

在方法設計方面 - 您不應該依賴調用方法來檢查返回值。如果有人忘記檢查,如果返回false會發生什麼?例外情況會導致此問題消失,因爲發生了某些問題,並且代碼停止運行。

0

所有的書都說你應該使用異常來處理信號錯誤。如果您使用if,那麼您的源代碼行中有50%是關於返回錯誤消息的,並且很難讀取源代碼並查看它是否無錯。

僅在時間緊迫的情況下使用返回值,您希望發生許多錯誤,並且計算時間對您非常重要。

0

我喜歡異常。我只是做。當然,這取決於你在哪裏執行。

例如,我想要一些非常基本的類來引發異常,因爲我不希望這些類有責任不拋出它。

C#的好處在於,您不必捕捉每個異常,因爲如果出錯,它會進一步拋出異常。這樣可以爲您節省很多代碼。其他與布爾值,它將是:if false -> return false; if false -> return false;。我認爲會是開銷。

當然,在某些時候,你必須捕捉你的例外,但這是實施者在哪裏做的選擇。當然,你不需要一些巨大的抓塊,但是隻有在你想抓到的地方,你應該抓住它。

我願意爲之努力。

1

例外情況應該保留用於特殊情況,例如資源不可用例如,磁盤空間或網絡連接。

使用異常進行流量控制簡直是錯的,它沒有正確的味道。

使用布爾返回碼是一種方法。您也可以創建一個描述錯誤原因的錯誤對象,而不是通過ref返回。

0

這取決於你認爲「假」狀態是否是例外。換句話說,並不是普遍的預期。

例如,如果你在一個對象傳遞給這沒有任何意義,如果它是空的方法來完成工作,那麼也許你應該拋出一個ArgumentNullException的方法:

public void Foo(object obj) 
{ 
    if(obj == null) throw new ArgumentNullException("obj", "Object cannot be null."); 

    // 
}