上篇文章講述了C#集合知識(shí)點(diǎn),本文將介紹C#異常處理知識(shí)點(diǎn)。異常處理是.NET開(kāi)發(fā)中至關(guān)重要的一部分,它允許開(kāi)發(fā)者在程序出現(xiàn)錯(cuò)誤或不正常情況時(shí)采取適當(dāng)?shù)拇胧?,從而提高?yīng)用程序的穩(wěn)定性和可靠性。本文將介紹C#異常處理知識(shí)點(diǎn),異常的基本概念略過(guò),請(qǐng)查看官網(wǎng)。
1、自定義異常
開(kāi)發(fā)者可以創(chuàng)建自定義異常類(lèi),以便更好地處理特定于應(yīng)用程序的錯(cuò)誤情況。自定義異常類(lèi)通常繼承自 System.Exception,并可以自定義信息或?qū)傩詠?lái)描述異常情況。案例可以查看本公眾號(hào)之前的文章,如下:
詳解-->C#自定義異常就這么簡(jiǎn)單
2、捕獲不同類(lèi)型的異常
使用多個(gè) catch塊可以捕獲和處理不同類(lèi)型的異常。這使開(kāi)發(fā)者能夠根據(jù)異常類(lèi)型采取不同的處理措施,以更精確的找到異常的類(lèi)型并快速的解決問(wèn)題。案例如下:
try
{
// 可能引發(fā)異常的代碼
}
catch (ArgumentNullException ex)
{
// 處理特定類(lèi)型的異常
}
catch (IOException ex)
{
// 處理另一種IO類(lèi)型的異常
}
catch?(SfException?ex)
{
????//?處理自定義異常代碼
}
catch (Exception ex)
{
// 處理其他所有異常的通用代碼
}
3、異常過(guò)濾器
在C#6及更高版本支持異常過(guò)濾器,允許在 catch塊內(nèi)使用 when子句來(lái)進(jìn)一步篩選捕獲的異常。這樣可以根據(jù)異常的屬性或條件來(lái)選擇性地處理異常。案例如下
try
{
// 可能引發(fā)異常的代碼
}
catch (Exception ex) when (ex is MyException || ex is InvalidOperationException)
{
// 僅處理特定類(lèi)型的異常
}
//其中Exception是自定義異常
4、拋出異常的特殊方式
可以使用throw關(guān)鍵字可以在代碼中明確引發(fā)異常。這在開(kāi)發(fā)自定義異常、或在特定條件下引發(fā)異常時(shí)非常有用。
if (someCondition)
{
??? throw new MyException("這是個(gè)自定義異常。");
???? throw new Exception("這是個(gè)系統(tǒng)異常。");
}
4、?全局異常處理
在應(yīng)用程序中可以設(shè)置全局異常處理程序來(lái)捕獲未處理的異常并記錄或者發(fā)送消息給開(kāi)發(fā)者,以便及時(shí)修復(fù)問(wèn)題。這對(duì)于監(jiān)視和維護(hù)生產(chǎn)環(huán)境中的應(yīng)用程序非常重要??梢园旬惓7诺匠绦虻娜肟?,便于檢測(cè)全局。案例如下:
static void Main()
{
// 在應(yīng)用程序的入口點(diǎn)設(shè)置全局異常處理程序
AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler;
// 模擬一個(gè)可能引發(fā)異常的操作
int result = Divide(10, 0);
Console.WriteLine("輸出: " + result); // 這行代碼不會(huì)被執(zhí)行
// 其他應(yīng)用程序邏輯
Console.WriteLine("應(yīng)用繼續(xù)運(yùn)行!");
}
static int Divide(int x, int y)
{
return x / y;
}
static void GlobalExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
// 這個(gè)方法會(huì)在未處理異常發(fā)生時(shí)被調(diào)用
Exception ex = (Exception)e.ExceptionObject;
Console.WriteLine("Unhandled Exception: " + ex.Message);
// 在此可以進(jìn)行異常處理,例如記錄錯(cuò)誤日志、通知開(kāi)發(fā)人員、嘗試恢復(fù)應(yīng)用程序等
// 通常,全局異常處理后會(huì)終止應(yīng)用程序
}
5、異常類(lèi)層次結(jié)構(gòu)
.NET中的異常都是從 System.Exception類(lèi)派生的。這個(gè)異常類(lèi)層次結(jié)構(gòu)有助于區(qū)分不同類(lèi)型的異常,并采取相應(yīng)的處理措施。常見(jiàn)的異常類(lèi)型包括:
System.NullReferenceException:當(dāng)嘗試訪問(wèn)空對(duì)象引用時(shí)引發(fā)。
System.ArgumentException:當(dāng)方法的參數(shù)無(wú)效時(shí)引發(fā)。
System.IO.IOException:用于處理文件和輸入/輸出操作的異常。
6、異常處理規(guī)范
異常處理提供了必要的結(jié)構(gòu),但若使用不當(dāng)可能帶來(lái)很多問(wèn)題。以下是異常處理的一些規(guī)范,僅供參考。
1)只捕捉可處理的異常:僅捕獲已知如何處理的異常,避免不必要的捕獲。其他異常應(yīng)留給更高級(jí)別的調(diào)用者。
2)不要隱藏(bury)無(wú)法完全處理的異常:不要假裝異常沒(méi)有發(fā)生,除非明確有處理方式。應(yīng)該重新拋出異常,以便更高級(jí)別的代碼能夠處理。
3)盡量減少使用 System.Exception 和一般 catch 塊:雖然幾乎所有異常都是從 System.Exception 派生的,但某些異常最佳處理方式是不處理它們,或者盡快關(guān)閉應(yīng)用程序。
4)避免在調(diào)用棧較低的位置報(bào)告異常:將異常報(bào)告和記錄放在調(diào)用棧較高的位置,以便更容易追蹤和診斷問(wèn)題。
5)想好異常條件來(lái)避免在catch塊中重新拋出異常:如果發(fā)現(xiàn)會(huì)捕捉到不能恰當(dāng)處理、所以需要重新拋出的異常,那么最好優(yōu)化異常條件,從一開(kāi)始就避免捕捉。
6)避免在異常條件表達(dá)式中拋出異常:如提供了異常條件表達(dá)式,要避免在表達(dá)式中拋出異常,否則會(huì)造成條件變成false,新異常被忽略。因此,可考慮在一個(gè)單獨(dú)的方法中執(zhí)行復(fù)雜的條件檢查,用try/catch塊包裝該方法調(diào)用來(lái)顯式處理異常。
7)避免以后可能變化的異常條件表達(dá)式:如異常條件可能因本地化等情況而改變,預(yù)期的異常條件將不被捕捉,進(jìn)而改變業(yè)務(wù)邏輯。因此,要確保異常條件不會(huì)因時(shí)間而改變。
結(jié)語(yǔ)
本文講述了C#異常處理的知識(shí)點(diǎn),這些是.NET開(kāi)發(fā)中處理異常不可或缺的技能之一。通過(guò)正確處理異常,開(kāi)發(fā)者可以提高應(yīng)用程序的可靠性、穩(wěn)定性和可維護(hù)性,更容易診斷和修復(fù)問(wèn)題。
希望本文提供的C#異常處理知識(shí)對(duì)每個(gè).NET開(kāi)發(fā)者都有所幫助,對(duì)于C#異常處理的知識(shí)點(diǎn),你還知道哪些?歡迎留言討論或者吐槽本文。
參考:
1、微軟官方文檔 :
learn.microsoft.com/zh-cn/dotnet/standard/exceptions/
2、圖書(shū)《C# 7.0本質(zhì)論》
3、chatgpt
推薦閱讀
1、每個(gè).NET開(kāi)發(fā)都應(yīng)掌握C#泛型的幾個(gè)知識(shí)點(diǎn)
2、每個(gè).NET開(kāi)發(fā)都應(yīng)掌握的linq知識(shí)點(diǎn)
3、每個(gè).NET開(kāi)發(fā)都應(yīng)掌握的C#接口知識(shí)點(diǎn)
4、每個(gè).NET開(kāi)發(fā)都應(yīng)掌握的C#委托事件知識(shí)點(diǎn)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-712182.html
5、每個(gè).NET開(kāi)發(fā)都應(yīng)掌握的C#集合知識(shí)點(diǎn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-712182.html
來(lái)源公眾號(hào):DotNet開(kāi)發(fā)跳槽????
到了這里,關(guān)于每個(gè).NET開(kāi)發(fā)都應(yīng)掌握的C#異常處理知識(shí)點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!