2017-09-06 21 views
0

如果OracleException在這裏不是我正在查找的內容,那麼會發生什麼?我需要扔嗎?在這裏捕捉一個通用的異常是正確的做法嗎?如何管理特定和一般的異常

try 
{ 
    does some code 
} 
catch (OracleException ex) 
{ 
    if (ex.Number == 20001) 
    { 
     throw new ValidationException("Unable blah blah blah"); 
    } 
    throw; 
} 
catch (Exception ex) 
{ 
    // Log it 
    TraceHelper.WriteLine("Exception updating tblah + Environment.NewLine + ex.StackTrace, MessageCategory.Error); 
    throw; 
} 

回答

1

一個非常好的事情就是在代碼中發現錯誤時才能實現。你是怎樣做的?通常會崩潰或放置一個陷阱異常並以某種方式通知開發人員的全局異常處理程序。

捕獲泛型異常並且不拋出它違背了先前的聲明,所以建議不要這樣做。

它通常被接受爲一個很好的做法,快速失敗(here a description

最後但並非租給你通常不想要趕上例外,你不知道如何才能恢復。如果你有一個bug並且你有一個ArgumentNullException,你會在你的應用程序中做什麼?在你的代碼中沒有任何東西可以從這種情況中恢復,你必須失敗,告知用戶和開發者並結束應用程序。

1

這看起來像你只想趕上OracleException基於該例外的某些條件。好消息是,隨着C#6.0你可以添加一個when條款補充一點情況:

catch (OracleException ex) when (ex.Number == 20001) 
{ 
    throw new ValidationException("Unable blah blah blah"); 
} 

這意味着,如果ex.Number不是20001,拋出的異常會檢查你的下一個catch子句,在這種情況下,它會陷入你的通用捕獲。

通用抓不管是不是應該有高達辯論,作爲一個經驗一般規則,你不應該有通用的異常處理。如果你不知道爲什麼代碼拋出異常,你怎麼能期望成功處理它?

+0

不錯,那麼如果它不是20001型會發生什麼?我想這是我不知道如何處理。 – Dritzz

+0

@Dritzz查看更新 – ediblecode

+0

看起來不是正在運行的6.0,並且無法在短期內更新它 – Dritzz