<s id="0oyqk"></s>
  • <option id="0oyqk"><optgroup id="0oyqk"></optgroup></option>
  • <source id="0oyqk"><bdo id="0oyqk"></bdo></source>
  • 你應該知道的.NET錯誤與異常處理機制

     更新時間:2019-09-08 20:01:33   作者:佚名   我要評論(0)

    前言


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

    前言

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

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

    異常類

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

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

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

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

    其他可能會用到的異常類包括:

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

    使用try...catch...finally捕獲異常

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

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

    在異常捕獲中,我們可以實現多個catch塊來針對不同的錯誤做出對應的錯誤處理。下面我們看一個例子:

    class Program
     {
     static void Main(string[] args)
     {
      while (true)
      {
      try
      {
       string userInput;
       Console.WriteLine("請輸入0-5之間任意一個數字:");
       userInput = Console.ReadLine();
       if (string.IsNullOrWhiteSpace(userInput))
       {
       break;
       }
    
    
       if (int.TryParse(userInput, out int index))
       {
       if (index < 0 || index > 5)
       {
    
        throw new IndexOutOfRangeException($"你輸入的數字是{index}");
    
       }
       Console.WriteLine($"你輸入的數字是{index}");
       }
       else
       {
       throw new Exception("請輸入數字");
       }
      }
      catch (IndexOutOfRangeException ex)
      {
       Console.WriteLine($"你輸入的數字不在此范圍內.{ex.Message}");
      }
      catch (Exception ex)
      {
    
       Console.WriteLine(ex.Message);
      }
      finally
      {
       Console.WriteLine("謝謝合作");
      }
    
      
      }
     }
     }

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

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

    屬性

    說明

    Data

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

    HelpLink

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

    InnerException

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

    Message

    描述錯誤情況的文本

    Source

    導致異常的應用程序名或對象名

    StackTrace

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

    Hresult

    分配給異常的一個數值

    TargetSite

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

    過濾異常、創建用戶定義的異常

    自從C#6開始就支持異常過濾器。Catch塊僅在過濾器但會true時執行。捕獲不同的異常類型時,可以有行為不同的代碼塊。在某些情況下,catch塊基于異常的內容執行不同的操作。下面我們看下如何來使用異常過濾器吧:

     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("數據超出了范圍") { ErrorCode = 1 };
        }
    
       }
    
       catch (MyIndexOutOfException ex) when (ex.ErrorCode!=1)
    
       {
        Console.WriteLine("出現了自定義錯誤");
       }
    
       catch (MyIndexOutOfException ex) when (ex.ErrorCode == 1)
       {
        Console.WriteLine(ex.Message);
       }
    
       catch (Exception ex)
       {
    
        throw;
       }
      }
     }

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

    總結

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

    好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

    您可能感興趣的文章:

    • asp.net 錯誤:0x8007000B 異常的解決方法
    • asp.net iis7默認文檔錯誤異常的解決方法
    • ASP.NET Core異常和錯誤處理(8)
    • ASP.NET生成eurl.axd Http異常錯誤的處理方法
    • ASP.NET MVC中異常處理&自定義錯誤頁詳析
    • ASP.NET Core應用錯誤處理之DeveloperExceptionPageMiddleware中間件呈現“開發者異常頁面”

    相關文章

    • 你應該知道的.NET錯誤與異常處理機制

      你應該知道的.NET錯誤與異常處理機制

      前言 錯誤的出現并不總是編寫程序的人的原因,有時應用程序會因為應用程序的最終用戶引發的動作或運行代碼的環境發生錯誤。無論如何,我們都應預測應用程序
      2019-09-08
    • 深入了解Python在HDA中的應用

      深入了解Python在HDA中的應用

      Event Handler 在HDA中,要創建Python腳本,需要先選擇一個事件處理器(EventHandle),他表示你要在什么時候執行你現在所創建的腳本命令 On Created (在節點創建
      2019-09-08
    • Python代理IP爬蟲的新手使用教程

      Python代理IP爬蟲的新手使用教程

      前言 Python爬蟲要經歷爬蟲、爬蟲被限制、爬蟲反限制的過程。當然后續還要網頁爬蟲限制優化,爬蟲再反限制的一系列道高一尺魔高一丈的過程。爬蟲的初級階段
      2019-09-08
    • WCF中使用nettcp協議進行通訊的方法

      WCF中使用nettcp協議進行通訊的方法

      快速閱讀 如何在wcf中用net tcp協議進行通訊,一個打開Wcf的公共類。比較好好,可以記下來。 配置文件中注意配置 Service,binding,behaviors. Service中配
      2019-09-08
    • ASP.NET Core MVC學習之視圖組件(View Component)

      ASP.NET Core MVC學習之視圖組件(View Component)

      1.視圖組件介紹   視圖組件是 ASP.NET Core MVC 的新特性,類似于局部視圖,但它更強大。視圖組件不使用模型綁定,并且僅依賴于調用它時所提供的數據。   
      2019-09-08
    • .net 生成拼音碼與五筆碼實例代碼

      .net 生成拼音碼與五筆碼實例代碼

      實例代碼: <&#63;xml version="1.0" encoding="utf-8" &#63;> <CodeConfig> <SpellCode> <A>阿啊錒嗄厑哎哀唉埃挨溾锿鎄啀捱皚凒溰嘊敳皚癌毐昹噯矮
      2019-09-08
    • WCF如何綁定netTcpBinding寄宿到控制臺應用程序詳解

      WCF如何綁定netTcpBinding寄宿到控制臺應用程序詳解

      契約 新建一個WCF服務類庫項目,在其中添加兩個WCF服務:GameService,PlayerService 代碼如下: [ServiceContract] public interface IGameService {
      2019-09-08
    • .Net之微信小程序獲取用戶UnionID的實現

      .Net之微信小程序獲取用戶UnionID的實現

      前言: 在實際項目開發中我們經常會遇到賬號統一的問題,如何在不同端或者是不同的登錄方式下保證同一個會員或者用戶賬號唯一(便于用戶信息的管理)。這段時
      2019-09-08
    • .Net項目中NLog的配置和使用實例詳解

      .Net項目中NLog的配置和使用實例詳解

      引言: 因為之前在項目開發中一直都是使用的Log4Net作為項目的日志記錄框架,最近忽然感覺對它已經有點膩了,所以嘗試著使用了NLog作為新項目的日志記錄框
      2019-09-08
    • 使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析

      使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析

      公司的產品一直緊跟 .net core 3.0 preview 不斷升級, 部署到 Linux 服務器后, 偶爾會出現某個進程CPU占用100%.   由于服務部署在云上, 不能使用遠程調試
      2019-09-08

    最新評論

    种子磁力搜索器