2011-07-06 57 views

回答

2

catch (...) in C++。

可能使你的代碼看起來穩定的最糟糕的方式...

這同樣適用於任何其他語言,在這裏你抓你不應該有異常,只是他們吞下默默地以隱藏錯誤來自用戶。但(...)通常用於捕獲異常,如NULL指針取消引用或拒絕訪問,這意味着吞下的錯誤可能會稍後以可能看起來與問題根本無關的方式顯現。

3

爲清理邏輯

從析構函數在清理代碼投擲。這個是非常糟糕的,因爲a。)從析構函數中拋出通常是不好的,b)因爲即使你能夠捕獲它,關於它也沒有什麼可做的。

File::~File() 
{ 
    if (!close(fd_)) { 
     throw FileIOException("Could not close descriptor.", fd_); 
    } 
} 

來自地獄的UI

try { 
    // ... lots of UI logic here ... 
} catch (Exception error) { 
    alert("This program has performed an illegal operation and needs to quit."); 
    System.exit(-1); 
} 

重試沒有退避

bool has_connected = false; 
while (!has_connected) { 
    try { 
     EstablishConnection(); 
     has_connected = true; 
    } catch (...) { 
     // IGNORE 
    } 
    } 
+0

沒有回退的重試會將性能問題轉化爲可用性問題。好的。 –

1

我最大的忌諱是建立一個例外的繼承層次結構,其中後代的關係提供小軸承關於是否應該發現一個例外。關於預定義的異常沒有太多的工作要做,但是我的首選是避免拋出這些異常,而是爲調用者假定系統狀態正常的情況定義新的異常,除了例程所暗示的範圍之外不會成功返回,而不是系統狀態被拋棄的那些。例如,如果某個方法應該打開一個文件並返回一個新的文檔對象,但解析該文件時存在一些問題,則不應該殺死整個應用程序。它應該讓用戶知道該文件無法打開,然後像用戶未試圖打開文件那樣繼續。這與文件沒有打開的原因無關。問題是應用程序狀態是否已損壞。不幸的是,沒有一個標準例外很好地處理這個問題。

+0

也許這是因爲無法打開文件並不是一個真正的例外事件?這不應該是常規錯誤處理的一部分嗎? –

+0

@Sedate Alien:有時它應該是例外,有時候不是;這就是Try/Do模式的用途。但是,在解析例程中,通常會使用異常來中止不成功的解析,而不是測試每個單獨的子操作以獲得成功。錯誤檢查幾乎是解析例程長度的兩倍,這種情況並不少見;如果錯誤檢查唯一能做的就是中止解析,使用異常可以將代碼大小減半。 – supercat

3

這是一個不完全不同於我以前見過的東西。

try { 
    methodThatThrowsSomeException1(); 
    methodThatThrowsSomeOtherException2(); 
    methodThatThrowsSomeOtherException3(); 
    methodThatThrowsSomeOtherException4(); 
    methodThatThrowsSomeOtherException5(); 
    methodThatThrowsSomeOtherException6(); 
    ... 
    methodThatThrowsYetAnotherException20(); 
} catch (Throwable e) { 
    log.error("There was a problem reading the user role"); 
    role = PRIVILEGED; 
} 
1

在共享庫中使用意圖從多種語言/ C++方言中使用的例外。由於C++編譯器無法保證您不會意外地將異常拋出回調用方(與Java不同),您只需設置自己的崩潰。