【C# 基礎精講】異常的類型和處理方法

在這里插入圖片描述

異常(Exception)是在程序執行過程中發生的意外或異常情況,例如除零錯誤、空引用訪問、文件不存在等。在C#及其他編程語言中,異常處理是一種重要的機制,用于捕獲和處理程序運行時可能出現的錯誤,以保證程序的健壯性和穩定性。本文將詳細介紹C#中的異常類型、異常處理機制以及最佳實踐。

1. 異常類型

在C#中,異常分為兩種類型:系統異常和自定義異常。

1.1 系統異常

系統異常是由.NET Framework或C#標準庫引發的異常。它們是一些常見的運行時錯誤,如除以零、空引用訪問、數組越界等。以下是一些常見的系統異常:

  • ArithmeticException:算術異常,如除以零。
  • NullReferenceException:空引用異常,當試圖在引用為null的對象上調用方法或訪問屬性時引發。
  • IndexOutOfRangeException:索引越界異常,當數組或集合的索引超出范圍時引發。
  • InvalidOperationException:無效操作異常,當執行的操作無效或不合理時引發,如集合為空時調用Remove方法。

1.2 自定義異常

除了系統異常,您還可以根據需要創建自定義異常類,以便在特定情況下引發并捕獲異常。自定義異常類通常是從Exception類派生而來,您可以為其添加自定義的屬性和方法。

class MyCustomException : Exception
{public MyCustomException(string message) : base(message){}
}

在程序中,您可以使用throw關鍵字來引發異常:

if (someCondition)
{throw new MyCustomException("This is a custom exception.");
}

2. 異常處理

異常處理是指在程序中檢測、捕獲和處理異常的過程,以防止程序在遇到錯誤時崩潰或產生不受控制的行為。在C#中,異常處理主要通過trycatchfinallythrow等關鍵字來實現。

2.1 try-catch 塊

try-catch塊用于捕獲并處理異常。在try塊中編寫可能引發異常的代碼,然后使用一個或多個catch塊來捕獲不同類型的異常并進行處理。

try
{// 可能引發異常的代碼
}
catch (DivideByZeroException ex)
{Console.WriteLine("除以零錯誤:" + ex.Message);
}
catch (Exception ex)
{Console.WriteLine("發生異常:" + ex.Message);
}

在上述示例中,DivideByZeroException是系統異常的一種,catch塊捕獲并處理了除以零錯誤。第二個catch塊用于捕獲其他類型的異常。

2.2 finally 塊

finally塊用于在無論是否發生異常的情況下都會執行的代碼。通常在finally塊中進行清理操作,如關閉文件、釋放資源等。

try
{// 可能引發異常的代碼
}
catch (Exception ex)
{Console.WriteLine("發生異常:" + ex.Message);
}
finally
{// 清理操作,不管是否發生異常都會執行
}

2.3 throw 關鍵字

throw關鍵字用于手動引發異常,您可以使用系統異常類或自定義異常類來引發異常。

if (someCondition)
{throw new MyCustomException("This is a custom exception.");
}

2.4 使用 using 語句處理資源

C#中的using語句可用于確保在使用完資源后正確釋放它們,以避免資源泄漏。例如,使用StreamReader讀取文件時,可以這樣處理:

using (StreamReader reader = new StreamReader("file.txt"))
{string content = reader.ReadToEnd();// 處理文件內容
} // 在此處自動調用 reader.Dispose() 釋放資源

3. 異常處理的最佳實踐

3.1 不要過度使用異常

異常處理應該用于處理真正的異常情況,而不是用于控制程序流程。過度使用異常會影響程序的性能和可維護性。

3.2 使用特定的異常類型

盡可能使用特定的異常類型來捕獲和處理異常,這樣可以更精確地處理不同類型的錯誤情況。

3.3 不要捕獲所有異常

避免在一個大的catch塊中捕獲所有異常,這會導致不容易定位和解決問題。應根據不同的異常情況提供適當的處理。

3.4 使用 finally 進行資源釋放

在使用可能會占用資源的對象(如文件、數據庫連接等)時,應使用finally塊確保資源在不管是否發生異常的情況下都能被釋放。

3.5 記錄異常信息

捕獲到的異常應該至少記錄錯誤信息,以便于調試和故障排除。可以使用日志記錄庫或輸出到控制臺。

3.6 自定義異常類

對于特定的業務邏輯或應用,可以創建自定義異常類來提供更有意義的異常信息,方便調試和處理。

3.7 嵌套異常處理

在一些情況下,可以在內部處理異常,然后在外部捕獲并記錄異常信息。

try
{try{// 可能引發異常的代碼}catch (Exception ex){// 內部處理異常}
}
catch (Exception ex)
{Console.WriteLine("外部捕獲異常:" + ex.Message);
}

3.8 全局異常處理

您還可以在應用程序級別設置全局異常處理,以處理未在特定地點捕獲的異常。這可以通過訂閱AppDomain.CurrentDomain.UnhandledException事件來實現。

class Program
{static void Main(string[] args){AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler;try{// 可能引發異常的代碼}catch (Exception ex){Console.WriteLine("發生異常:" + ex.Message);}}static void GlobalExceptionHandler(object sender, UnhandledExceptionEventArgs e){Exception ex = (Exception)e.ExceptionObject;Console.WriteLine("全局異常處理:" + ex.Message);// 可以在這里記錄日志等操作}
}

4. 異常處理實例

以下是一個使用異常處理的示例,演示了如何讀取文件內容并進行錯誤處理:

try
{using (StreamReader reader = new StreamReader("file.txt")){string content = reader.ReadToEnd();Console.WriteLine("文件內容:" + content);}
}
catch (FileNotFoundException ex)
{Console.WriteLine("文件不存在:" + ex.Message);
}
catch (IOException ex)
{Console.WriteLine("IO錯誤:" + ex.Message);
}
catch (Exception ex)
{Console.WriteLine("發生異常:" + ex.Message);
}
finally
{Console.WriteLine("處理結束。");
}

在上述示例中,我們使用了try-catch塊來捕獲不同類型的異常,處理了文件不存在和IO錯誤的情況,同時還使用了finally塊進行清理操作。

5. 總結

異常處理是編程中的重要部分,用于捕獲和處理程序運行時可能發生的錯誤情況,以確保程序的穩定性和健壯性。在C#中,您可以使用try-catch塊、finally塊和throw關鍵字來實現異常處理。通過選擇恰當的異常類型、適當的異常處理策略以及遵循最佳實踐,您可以提高程序的可靠性和可維護性。同時,了解何時使用自定義異常、全局異常處理和資源釋放等技術也是編寫高質量代碼的重要一環。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【碎碎念隨筆】1、回顧我的電腦和編程經歷

?? 閑著無事,講述一下我的計算機和代碼故事 一、初識計算機 🖥? 余家貧,耕植無錢買電腦。大約六年級暑假,我在姐姐哪兒第一次接觸到了計算機(姐姐也是買的二手)。 🖥? 計算機真有趣&#x…

多線程并發服務器

代碼&#xff1a; #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 6666 //1024~49151 #define IP "192.168.122.130" //ifconfig查看本機IP #include <pthread.h> //…

深入解析:HTTP和HTTPS的三次握手與四次揮手

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://drive.uc.cn/…

探索Python編程的技巧:多線程魔法、網絡舞臺、正則魔法陣與遞歸迷宮

一 多線程 1.1 進程和線程 進程&#xff1a; 就是一個程序&#xff0c;運行在系統之上&#xff0c;稱這個程序為一個運行進程&#xff0c;并分配進程ID方便系統管理。線程&#xff1a;線程是歸屬于進程的&#xff0c;一個進程可以開啟多個線程&#xff0c;執行不同的工作&…

【C++面向對象】--- 繼承 的奧秘(下篇)

個人主頁&#xff1a;平行線也會相交&#x1f4aa; 歡迎 點贊&#x1f44d; 收藏? 留言? 加關注&#x1f493;本文由 平行線也會相交 原創 收錄于專欄【C之路】&#x1f48c; 本專欄旨在記錄C的學習路線&#xff0c;望對大家有所幫助&#x1f647;? 希望我們一起努力、成長&…

Vim基本使用

Vim基本使用 概念模式類型常規模式編輯模式命令模式 概念 vim 是一款功能豐富、高度可定制和高效的文本編輯器&#xff0c;適用于處理各種文本文件和編程任務。熟練使用vim幫助提高編輯效率&#xff0c;并為用戶提供更多的操作選項。 模式類型 常規模式 使用vim打開一個文件…

Postman接口自動化測試實戰,從0到1一篇徹底打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 postman中的測試 …

【網絡基礎】傳輸層

【網絡基礎】傳輸層 文章目錄 【網絡基礎】傳輸層1、端口號1.1 工具 2、UDP協議2.1 協議端格式2.2 UDP特點2.3 傳輸數據報2.4 緩沖區2.5 基于UDP應用層協議2.6 使用注意事項 3、TCP協議3.1 協議段格式3.2 ACK機制3.3 超時重傳機制3.4 連接管理機制3.5 滑動窗口3.6 流量控制3.7 …

207、仿真-51單片機脈搏心率與血氧報警Proteus仿真設計(程序+Proteus仿真+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選擇 方案一&a…

猿輔導Motiff與IXDC達成戰略合作,將在UI設計領域推動AI革新更多可能性

近日&#xff0c;“IXDC 2023國際體驗設計大會”在北京國家會議中心拉開序幕&#xff0c;3000設計師、1000企業、200全球商業領袖&#xff0c;共襄為期5天的用戶體驗創新盛會。據了解&#xff0c;此次大會是以“設計領導力”為主題&#xff0c;分享全球設計、科技、商業的前沿趨…

報錯解決:matlab機器人工具箱不支持將腳本 DHFactor 作為函數執行

matlab使用機器人工具箱出現報錯&#xff1a; 不支持將腳本 DHFactor 作為函數執行: D:\MATLAB\install\toolbox\rvctools\robot\DHFactor.m 解決辦法&#xff1a;重新到上圖的rvctool重重新安裝一下工具箱就好了。 到目錄"$機器人工具箱路徑$\rvctools" 在matlab命…

使用Scanner接收用戶輸入

掃描輸入的兩種方式 Scanner主要提供了兩個方法來掃描輸入&#xff1a; &#xff08;1&#xff09;hasNextXxx()&#xff1a;是否還有下一個輸入項&#xff0c;Xxx可以是Int&#xff0c;Long等代表基本數據類型的字符串。 如果只是判斷是否包含下一個字符串&#xff0c;則直…

新手開抖店多久可以出單?

?開抖店是一種越來越流行的創業方式&#xff0c;在社交媒體平臺上開店銷售各種商品&#xff0c;比如服裝、配飾、美妝和家居用品等等。對于新手來說&#xff0c;他們可能會很關心自己開抖店能夠多久出單。雖然這個問題沒有一個固定的答案&#xff0c;但是以下是一些關鍵的運營…

【boost網絡庫從青銅到王者】第三篇:asio網絡編程中的buffer緩存數據結構

文章目錄 1、關于buffer數據結構1.1、簡單概括一下&#xff0c;我們可以用buffer() 函數生成我們要用的緩存存儲數據。1.2、但是這太復雜了&#xff0c;可以直接用buffer函數轉化為send需要的參數類型:1.3、output_buf可以直接傳遞給該send接口。我們也可以將數組轉化為send接受…

docker發展歷史

docker 一、docker發展歷史很久以前2013年2014年2015年2016年2017年2018年2019年及未來 二、 docker概述定義&#xff1a;docker底層運行原理:docker簡述核心概念容器特點Docker與虛擬機的區別: 三、容器在內核中支持兩種重要技術四、namespace的六項隔離五、虛擬化產品有哪些1…

CAS 的執行流程 ?CAS 中 ABA 問題如何解決 ?CAS 在 Java 中有哪些實現類 ?

目錄 1. CAS 的執行流程 2. CAS 中的 ABA 問題 3. 如何解決 CAS 中的 ABA 問題 4.CAS 在Java 中的實現類有哪些 1. CAS 的執行流程 CAS 比較并替換的大致流程是這樣的&#xff1a; 它有三個操作單位&#xff1a;V&#xff08;內存值&#xff09;&#xff0c;A&#xff08;…

3D沉浸式旅游網站開發案例復盤【Three.js】

Plongez dans Lyon網站終于上線了。 我們與 Danka 團隊和 Nico Icecream 共同努力&#xff0c;打造了一個令我們特別自豪的流暢的沉浸式網站。 這個網站是專為 ONLYON Tourism 和會議而建&#xff0c;旨在展示里昂最具標志性的活動場所。觀看簡短的介紹視頻后&#xff0c;用戶…

Android 面試筆記整理-Binder機制

作者&#xff1a;浪人筆記 面試可能會問到的問題 從IPC的方式問到Binder的優勢為什么zygote跟其他服務進程的通訊不使用BinderBinder線程池和Binder機制 等等這些問題都是基于你對Binder的理解還有對其他IPC通訊的理解 IPC方式有多少種 傳統的IPC方式有Socket、共享內存、管道…

llvm-dyn_cast模板函數

dyn_cast dyn_cast是LLVM中用于執行安全的向下轉型&#xff08;downcasting&#xff09;的一個模板函數。在C中&#xff0c;向下轉型是將基類的指針或引用轉換為派生類的指針或引用。這種轉型在運行時進行&#xff0c;如果轉型失敗&#xff08;即&#xff0c;如果基類的對象實…