<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      前言


        錯誤的出現(xiàn)并不總是編寫程序的人的原因,有時應用程序會因為應用程序的最終用戶引發(fā)的動作或運行代碼的環(huán)境發(fā)生錯誤。無論如何,我們都應預測應用程序中出現(xiàn)的錯誤,并相應的進行編碼。

        .Net改進了處理錯誤的方式。C#處理錯誤的機制可以為每種錯誤提供自定義處理方式,并把識別錯誤的代碼與處理錯誤的代碼分別開來。

      異常類


        在C#中當出現(xiàn)某個特殊的異常錯誤條件時,就會創(chuàng)建拋出一個異常對象,這個對象包含有助于跟蹤問題的信息。.Net提供了許多預定義的異常類,我們下面看看一些常見特別的異常類吧(異常類太多了,這里就介紹幾個常見的)。


        對于.Net類,一般的異常類System.Exception派生自System.Object,通常不在代碼中拋出System.Exception泛型對象,因為他們無法確定錯誤情況的本質(zhì)。

        在該層次中有兩個重要的類,他們派生自System.Exception類:

      *
      * ?
      SystemException------該類用于通常由.NET允許庫拋出的異常,或者由幾乎所有的應用程序拋出的異常。例如,如果.NET運行庫檢測到棧已滿,他就會拋出StackOverflowException異常。另一方面,如果檢測到調(diào)用方法時參數(shù)不對,就可以在自己的代碼中選擇拋出ArgumentException異?;蚱渥宇悺ystemException異常的子類包括表示致命錯誤和非致命錯誤的異常。
      * ?ApplicationException----在.NET
      Framework最初的設計中,是打算把這個類作為自定義應用程序異常類的基類的。不過,CLR拋出的一些異常類也派生自這個類。應用程序拋出的異常則派生自SystemException。因此從ApplicationException派生自自定義異常類型沒有任何好處,取而代之的是,可以直接從Exception基類派生自定義異常類。
        其他可能會用到的異常類包括:

      *
      * ?
      StackOverflowException-------如果分配給棧的內(nèi)存區(qū)域已滿,就會拋出這個異常。如果一個方法連續(xù)地遞歸調(diào)用自己,就可能發(fā)生棧溢出。這一般是一個致命錯誤,因為它禁止應用程序執(zhí)行除了中斷以外的其他任務。在這種情況下,甚至也不可能執(zhí)行到finally塊。通常用戶自己不能處理像這樣的錯誤,而應退出應用程序。
      * ?EndOfStreamException-------這個異常通常是因為讀到文件末尾而拋出的,流表示數(shù)據(jù)源之間的數(shù)據(jù)流。
      * ?OverflowException-----如果要在checked上下文中把包含-40的int類型數(shù)據(jù)強制轉(zhuǎn)換為uint數(shù)據(jù),就會拋出這個異常
      * ?
      MemberAccessException----------該類用于處理訪問類的成員失敗時所引發(fā)的異常。失敗的原因可能的原因是沒有足夠的訪問權(quán)限,也可能是要訪問的成員根本不存在(類與類之間調(diào)用時常用)
      * ?IndexOutOfException-------該類用于處理下標超出了數(shù)組長度所引發(fā)的異常
      使用try...catch...finally捕獲異常

      * try 塊包含的代碼組成了程序的正常操作部分,但這部分程序可能會遇到某些嚴重的錯誤。
      * catch塊包含的代碼處理各種錯誤,這些錯誤是執(zhí)行try塊中的代碼時遇到的問題。這個快可以用來記錄錯誤。
      *
      finally快包含的代碼清理資源或執(zhí)行通常要在try塊或者catch塊末尾執(zhí)行的其他操作。無論是否拋出異常,都會執(zhí)行finally塊。finally塊中防止return語句,編譯器會標記一個錯誤。另外此塊可以如果沒有需要關(guān)閉或者處理的其他操作可以省略此塊。
      ?

        異常處理具有性能含義,在常見的情況下,不應該使用異常處理錯誤。應盡量編寫好避免錯誤出現(xiàn)的代碼。

        在異常捕獲中,我們可以實現(xiàn)多個catch塊來針對不同的錯誤做出對應的錯誤處理。下面我們看一個例子:
      class Program { static void Main(string[] args) { while (true) { try { string
      userInput; Console.WriteLine("請輸入0-5之間任意一個數(shù)字:"); userInput = Console.ReadLine();
      if (string.IsNullOrWhiteSpace(userInput)) { break; } if (int.TryParse(userInput,
      out int index)) { if (index < 0 || index > 5) { throw new
      IndexOutOfRangeException($"你輸入的數(shù)字是{index}"); } Console.WriteLine($"
      你輸入的數(shù)字是{index}"); } else { throw new Exception("請輸入數(shù)字"); } } catch
      (IndexOutOfRangeException ex) { Console.WriteLine($"你輸入的數(shù)字不在此范圍內(nèi).{ex.Message}"
      ); }catch (Exception ex) { Console.WriteLine(ex.Message); } finally {
      Console.WriteLine("謝謝合作"); } } } }
      ?


        在此事例中,定義了兩個catch塊。如果輸入的超過規(guī)定返回的數(shù)字,則會拋出超出范圍的錯誤也就進入對應的catch塊。而輸入的非數(shù)字也就進入了另外一個catch塊進行處理。

        下面我們看一看關(guān)于System.Exception屬性。熟悉了解其中熟悉能更好的去觀察理解拋出的異常錯誤。


      屬性

      說明


      Data

      這個屬性可以給異常添加鍵/值語句,以提供關(guān)于異常的額外信息


      HelpLink

      連接到一個幫助文件上,以提供關(guān)于該異常的更多信息


      InnerException

      如果此異常是在catch塊中拋出的,它就會包含把代碼發(fā)送到catch塊的異常對象


      Message

      描述錯誤情況的文本


      Source

      導致異常的應用程序名或?qū)ο竺?br>

      StackTrace

      棧上方法調(diào)用的詳細信息,它有助于跟蹤拋出異常的方法


      Hresult

      分配給異常的一個數(shù)值


      TargetSite

      .NET反射對象,描述了拋出異常的方法

      ?

      ?

      過濾異常、創(chuàng)建用戶定義的異常


        自從C#6開始就支持異常過濾器。Catch塊僅在過濾器但會true時執(zhí)行。捕獲不同的異常類型時,可以有行為不同的代碼塊。在某些情況下,catch塊基于異常的內(nèi)容執(zhí)行不同的操作。下面我們看下如何來使用異常過濾器吧:
      public class MyIndexOutOfException :SystemException { public
      MyIndexOutOfException(string message) : base(message) { } public int ErrorCode {
      get; set; } } class Program { static void Main(string[] args) { try { int
      steInput =12; if (steInput > 10) { throw new MyIndexOutOfException("數(shù)據(jù)超出了范圍") {
      ErrorCode =1 }; } } catch (MyIndexOutOfException ex) when (ex.ErrorCode!=1) {
      Console.WriteLine("出現(xiàn)了自定義錯誤"); } catch (MyIndexOutOfException ex) when
      (ex.ErrorCode ==1) { Console.WriteLine(ex.Message); } catch (Exception ex) {
      throw; } } }
      ?

        上面例子中,自定義了一個異常處理,同事增加ErrorCode,以此啦作為過濾條件,利用關(guān)鍵字When+條件來進行過濾。

      總結(jié)


        本篇文章介紹了異常處理錯誤的情況及機制,我們不僅可以輸出代碼好難過的一般錯誤代碼,也可以輸出我們自己定義的特殊錯誤情況。無論編程技術(shù)有多好,程序都必須能處理可能出現(xiàn)的任何錯誤。對不同的錯誤采取相應的應對措施,才是正確編碼的其中一步。

      ?

            不是井里沒有水,而是你挖的不夠深。不是成功來得慢,而是你努力的不夠多。

      ?

      ?

      ?              c#基礎知識詳解系列 <https://www.cnblogs.com/hulizhong/p/11205119.html>

      ?

      歡迎大家掃描下方二維碼,和我一起學習更多的C#知識

      ?

        

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          色七七久久影院 | 2024黄片 | 一级特黄性色生活片免费观看 | 日逼片大全 | 中文字幕一区二区三区有限公司 | 天天曰夜夜操 | 国产日韩精品无码去免费专区国产 | 捆绑调教sm灌肠 | 亚洲骚妇 | 韩国精品一区二区三区无码视频 |