3 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
在沒有充分理由的情況下將任何代碼包裝在try/ catch塊中都是不好的做法。
在.NET編程模型中,應(yīng)為真正的例外情況或條件保留例外。您應(yīng)該僅嘗試捕獲實(shí)際上可以執(zhí)行某些操作的異常。此外,你應(yīng)該應(yīng)該很難永遠(yuǎn)抓住基礎(chǔ)System.Exception類(而是更愿意搭上更具體的,你得到的異常類可以辦理)。而且,如果在程序執(zhí)行過程中遇到真正意外的異常,您實(shí)際上應(yīng)該崩潰。
顯然,“正確”的答案必須根據(jù)具體情況而定,具體取決于塊中該// code占位符內(nèi)部的情況catch。但是,如果您要尋求一般規(guī)則或“最佳實(shí)踐”,則應(yīng)該始終有捕獲異常的特定原因,而不是理所當(dāng)然地不只是將所有代碼包裝在一個(gè)大的try/ catch塊中。
請(qǐng)注意,如果您只是試圖捕獲可能出于記錄或錯(cuò)誤報(bào)告目的而發(fā)生的任何未處理的異常,則應(yīng)使用AppDomain.UnhandledExceptionevent。這是一個(gè)僅通知事件,因此不允許您處理這些異常,但是在應(yīng)用程序崩潰后,它是實(shí)現(xiàn)日志記錄或錯(cuò)誤報(bào)告功能的正確位置。
編輯:當(dāng)我趕上閱讀雷蒙德·陳(Raymond Chen)出色的博客“舊事物”時(shí),我注意到他最近發(fā)表了一篇有關(guān)類似主題的文章。它特定于COM,而不是.NET Framework,但有關(guān)錯(cuò)誤處理的一般概念同樣適用于兩種環(huán)境。我以為我在這篇文章中可以分享一些寶石,以支持我的[顯然頗有爭(zhēng)議的]觀點(diǎn)。
從歷史上看,COM圍繞服務(wù)器的方法進(jìn)行了巨大的嘗試/例外。如果您的服務(wù)器遇到通常是未處理的異常,巨型try / except將捕獲該異常并將其變?yōu)閑rror RPC_E_SERVERFAULT。然后將異常標(biāo)記為已處理,從而使服務(wù)器保持運(yùn)行狀態(tài),從而“即使遇到問題也可以通過保持服務(wù)器運(yùn)行狀態(tài)來(lái)提高魯棒性”。
提醒您,這實(shí)際上是一種傷害。
發(fā)生未處理的異常的事實(shí)意味著服務(wù)器處于意外狀態(tài)。通過捕獲異常并說(shuō)“不用擔(dān)心,這一切都很好”,您最終使損壞的服務(wù)器處于運(yùn)行狀態(tài)。
[。。。]
捕獲所有異常并讓進(jìn)程繼續(xù)運(yùn)行,假定服務(wù)器可以從意外故障中恢復(fù)。但這是荒謬的。您已經(jīng)知道服務(wù)器是無(wú)法恢復(fù)的吐司:它崩潰了!
更好的方法是讓服務(wù)器崩潰,以便可以在故障點(diǎn)捕獲崩潰轉(zhuǎn)儲(chǔ)?,F(xiàn)在,您將有很大的機(jī)會(huì)了解正在發(fā)生的事情。
您可以[并且應(yīng)該]在他的博客上閱讀整篇文章:如何關(guān)閉COM“有幫助地”包裝在服務(wù)器周圍的異常處理程序。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果您正在做最聰明的事情,可以使用此錯(cuò)誤,那是個(gè)好習(xí)慣。這就是try / catch的目的。
如果您只是丟掉錯(cuò)誤(或?qū)⑵溆涗洸G掉)-尤其是無(wú)論異常類型如何,都將其視為錯(cuò)誤的做法。
這可能會(huì)引發(fā)一個(gè)問題:如果最聰明的事情是將其記錄并丟棄該怎么辦?我想說(shuō)的是例外。但實(shí)際上,我的代碼會(huì)斷言。我想我沉迷于許多不良做法。

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
我同意科迪所說(shuō)的90%。在某些情況下,類似于pluggin示例,您可能想捕獲系統(tǒng)異常。這是考慮使用WCF Web服務(wù)的另一個(gè)示例。
目標(biāo):即使遇到錯(cuò)誤,也要使用服務(wù)并進(jìn)行處理。讓錯(cuò)誤冒泡。
public static bool DoRemoteWebServiceWork()
{
bool result;
RemoteWebServiceClient client = new RemoteWebServiceClient();
try
{
result = client.DoWork();
client.Close();
}
catch (Exception)
{
client.Abort(); //dispose
throw;//This service is critical to application function. The application should break if an exception is thrown.
//could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code.
}
return result;
}
目標(biāo):即使遇到錯(cuò)誤,也要使用服務(wù)并進(jìn)行處理。防止錯(cuò)誤冒泡。
public static bool DoRemoteWebServiceWork()
{
bool result;
RemoteWebServiceClient client = new RemoteWebServiceClient();
try
{
result = client.DoWork();
client.Close();
}
catch (Exception)
{
client.Abort(); //dispose
//throw; //This service is auxiliary to the applications primary function. We have no influence over the service and therefore cannot fix it.
//could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code.
}
return result;
}
- 3 回答
- 0 關(guān)注
- 734 瀏覽
添加回答
舉報(bào)