C#異常處理的一些經(jīng)驗(yàn)和技巧
1、什么時(shí)候該異常處理?
1)代碼最外層,如WinFrom,避免用戶看到內(nèi)部異常信息用戶體驗(yàn)不好,或者造成程序崩潰。
2)遇到異常需要恢復(fù)狀態(tài)或者重試的地方。例如連接數(shù)據(jù)庫(kù)偶然失敗了,可以有個(gè)重連機(jī)制,在Catch塊重新連接數(shù)據(jù)庫(kù)。
3)對(duì)于一系列有可能失敗的任務(wù),其中有一個(gè)任務(wù)失敗,不想影響到其他任務(wù)。例如要上傳100張圖片,不想因?yàn)橐粡垐D片上傳發(fā)生異常而失敗,進(jìn)而終止整個(gè)上傳任務(wù),僅需要記錄下失敗的圖片,提醒用戶重傳即可。
2、異常處理需要注意的地方
1)Catch和Finally代碼應(yīng)該非常短,而且成功率極高,避免自己又拋出一個(gè)異常。否則CLR會(huì)終止進(jìn)程,避免安全漏洞或者不可預(yù)知的后果。這個(gè)類(lèi)似于Windows藍(lán)屏,發(fā)生了嚴(yán)重的錯(cuò)誤,寧愿使系統(tǒng)不可用。
2)Catch塊盡量避免直接捕捉異常的基類(lèi)Exception,而應(yīng)該捕捉具體的異常類(lèi)。
3、異常處理的方法和技巧
1)是否能構(gòu)建統(tǒng)一的框架處理異常,而不用手工來(lái)處理呢?
有的人可能會(huì)問(wèn),能不能偷懶,在一個(gè)地方處理異常就行了。如果僅僅是記錄異常系統(tǒng)信息,通知到用戶,而且這些信息通常是可以缺少一些上下文的,是可以構(gòu)建同一的機(jī)制記錄異常信息的。
例如:
WinFrom的Application對(duì)象本身就提供了ThreadException時(shí)間來(lái)捕捉為處理的異常
static void Main()
{
//注冊(cè)捕捉異常事件
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Exception ex = e.Exception;
//做一些極其簡(jiǎn)單的記錄異常信息操作
}
又例如:
WebFrom的Global.asax本身就已經(jīng)定義了void Application_Error(object sender, EventArgs e) 來(lái)處理異常
void Application_Error(object sender, EventArgs e)
{
// 在出現(xiàn)未處理的錯(cuò)誤時(shí)運(yùn)行的代碼
Exception ex = Server.GetLastError();
//處理完異常后清除異常
Server.ClearError();
}
但是很多時(shí)候,異常處理,不僅僅只是記錄到了錯(cuò)誤信息就可以了,有時(shí)候是需要失敗重試或者清理資源等等,因此,僅僅靠統(tǒng)一構(gòu)建異常處理框架是不夠靈活的,因此可以一方面統(tǒng)一處理,另外一方面特殊的地方可以另外處理。
相關(guān)文章
user32.dll 函數(shù)說(shuō)明小結(jié)
這篇文章主要介紹了user32.dll 函數(shù)說(shuō)明,需要的朋友可以參考下2018-06-06Unity Shader相交算法實(shí)現(xiàn)簡(jiǎn)易防能量盾
這篇文章主要為大家詳細(xì)介紹了Unity Shader相交算法實(shí)現(xiàn)簡(jiǎn)易防能量盾,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C#使用CallContext緩存線程數(shù)據(jù)
這篇文章介紹了C#使用CallContext緩存線程數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#?WPF實(shí)現(xiàn)播放音頻文件的示例詳解
這篇文章主要為大家詳細(xì)介紹了利用C#?WPF實(shí)現(xiàn)播放音頻文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03c#中的浮點(diǎn)型轉(zhuǎn)整形的舍取 四舍五入和銀行家舍入實(shí)現(xiàn)代碼
c#中的浮點(diǎn)型轉(zhuǎn)整形的舍取 四舍五入和銀行家舍入實(shí)現(xiàn)代碼,學(xué)習(xí)c#的朋友可以參考下2012-03-03Unity?UGUI的StandaloneInputModule標(biāo)準(zhǔn)輸入模塊組件使用示例
這篇文章主要為大家介紹了Unity?UGUI的StandaloneInputModule標(biāo)準(zhǔn)輸入模塊組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08