C#中try-catch代碼塊的使用機(jī)制
?try-catch代碼塊是C#中用于異常處理的核心機(jī)制。異常是在程序執(zhí)行過程中可能出現(xiàn)的錯(cuò)誤,而try-catch代碼塊允許您在執(zhí)行代碼時(shí)捕獲并處理這些異常。
一、基礎(chǔ)結(jié)構(gòu)
try
{
//可能拋出異常的代碼
}
catch (ArgumentException ex)
{
//處理特定異常
}
catch (Exception ex)
{
//處理其他異常
}
finally
{
//無論是否存在異常最終都會(huì)執(zhí)行,可選
}
二、關(guān)鍵字詳解
1、try
- 包裹可能拋出異常的代碼
- 必須存在,后接catch或finally,或者二者都有
2、catch
- 捕獲異常
- 按順序執(zhí)行
catch (ArgumentException ex)
{
Console.WriteLine("參數(shù)異常:",ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("其他異常:", ex.Message);
}
3、finally
- 無論是否發(fā)生異常,都會(huì)執(zhí)行
- 常用來釋放資源(關(guān)閉文件、數(shù)據(jù)庫(kù)連接等)
- 無異常時(shí)執(zhí)行順序 try→finally
- 存在異常時(shí)執(zhí)行順序 try-catch-finally
三、關(guān)鍵特性
1、繼承
- 派生自 System.Exception
- 常見內(nèi)置異常:
- 空引用:NullReferenceException
- 文件未找到:FileNotFoundException
2、拋出異常
catch (Exception ex)
{
//使用 throw,而不是 throw ex,拋出原始異常
throw;
}
3、異常篩選器 when(C# 6.0+)
使用when關(guān)鍵字篩選異常
catch (IOException ex) when (ex.Message.Contains("正在使用"))
{
Console.WriteLine("文件被占用");
}
四、使用
1、適用場(chǎng)景
- 數(shù)據(jù)庫(kù)訪問
- 文件/網(wǎng)絡(luò) I/O 操作
2、避免濫用
- 不要過度使用異常
異常處理是用于處理真正的異常情況的,而不應(yīng)該被用于控制程序流程。過多的異常處理會(huì)影響性能和代碼可讀性 - 不用使用空的catch塊
捕獲到的異常至少應(yīng)該記錄錯(cuò)誤信息,以便于調(diào)試和故障排除。可以使用日志記錄庫(kù)或輸出到控制臺(tái) - 不要捕獲所有異常
避免在一個(gè)大的catch塊中捕獲所有異常,這會(huì)導(dǎo)致難以定位問題。根據(jù)異常類型提供適當(dāng)?shù)奶幚?/li> - 使用特定的異常類型
盡量使用特定的異常類型捕獲和處理異常,這樣可以更準(zhǔn)確地針對(duì)不同類型的錯(cuò)誤提供不同的處理邏輯 - 自定義異常類
在需要時(shí),可以創(chuàng)建自定義異常類,以提供更有意義的異常信息和處理方式。有助于調(diào)試和錯(cuò)誤處理
五、常見錯(cuò)誤
- 捕獲順序錯(cuò)誤:將 catch (Exception) 放在具體異常之前
- 忽略異常:空的 catch 塊導(dǎo)致靜默失敗
- ?資源泄漏:忘記在 finally 中關(guān)閉文件/連接
六、示例
try
{
var txt = File.ReadAllLines("tangshi.txt");
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"文件未找到: {ex.FileName}");
}
catch (IOException ex) when (ex.Message.Contains("正在使用"))
{
Console.WriteLine("文件被占用");
}
catch (Exception ex)
{
Console.WriteLine($"未知錯(cuò)誤: {ex.Message}");
}
finally
{
Console.WriteLine("清理完成");
}
到此這篇關(guān)于C#中try-catch代碼塊的使用機(jī)制的文章就介紹到這了,更多相關(guān)C# try-catch代碼塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用執(zhí)行外部程序的實(shí)現(xiàn)方法
這篇文章主要介紹了C#調(diào)用執(zhí)行外部程序的實(shí)現(xiàn)方法,涉及C#進(jìn)程調(diào)用的相關(guān)使用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-04-04
C#使用MSTest進(jìn)行單元測(cè)試的示例代碼
MSTest是微軟官方提供的.NET平臺(tái)下的單元測(cè)試框架,這篇文章主要為大家詳細(xì)介紹了C#如何使用MSTest進(jìn)行單元測(cè)試,感興趣的小伙伴可以參考一下2023-12-12
extern外部方法使用C#的實(shí)現(xiàn)方法
這篇文章主要介紹了extern外部方法使用C#的實(shí)現(xiàn)方法,較為詳細(xì)的分析了外部方法使用C#的具體步驟與實(shí)現(xiàn)技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
c#?Task.Wait()與awaiat?Task異常處理的區(qū)別說明
這篇文章主要介紹了c#?Task.Wait()與awaiat?Task異常處理的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Unity Shader實(shí)現(xiàn)圖形繪制(藍(lán)天白云大海)
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)圖形繪制,藍(lán)天白云大海,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04

