溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET錯誤與異常處理機制的示例分析

發(fā)布時間:2021-07-12 14:38:19 來源:億速云 閱讀:193 作者:小新 欄目:開發(fā)技術

這篇文章給大家分享的是有關.NET錯誤與異常處理機制的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

異常類

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

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

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

  •  SystemException------該類用于通常由.NET允許庫拋出的異常,或者由幾乎所有的應用程序拋出的異常。例如,如果.NET運行庫檢測到棧已滿,他就會拋出StackOverflowException異常。另一方面,如果檢測到調用方法時參數(shù)不對,就可以在自己的代碼中選擇拋出ArgumentException異?;蚱渥宇?。SystemException異常的子類包括表示致命錯誤和非致命錯誤的異常。

  •  ApplicationException----在.NET Framework最初的設計中,是打算把這個類作為自定義應用程序異常類的基類的。不過,CLR拋出的一些異常類也派生自這個類。應用程序拋出的異常則派生自SystemException。因此從ApplicationException派生自自定義異常類型沒有任何好處,取而代之的是,可以直接從Exception基類派生自定義異常類。

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

  •  StackOverflowException-------如果分配給棧的內存區(qū)域已滿,就會拋出這個異常。如果一個方法連續(xù)地遞歸調用自己,就可能發(fā)生棧溢出。這一般是一個致命錯誤,因為它禁止應用程序執(zhí)行除了中斷以外的其他任務。在這種情況下,甚至也不可能執(zhí)行到finally塊。通常用戶自己不能處理像這樣的錯誤,而應退出應用程序。

  •  EndOfStreamException-------這個異常通常是因為讀到文件末尾而拋出的,流表示數(shù)據(jù)源之間的數(shù)據(jù)流。

  •  OverflowException-----如果要在checked上下文中把包含-40的int類型數(shù)據(jù)強制轉換為uint數(shù)據(jù),就會拋出這個異常

  •  MemberAccessException----------該類用于處理訪問類的成員失敗時所引發(fā)的異常。失敗的原因可能的原因是沒有足夠的訪問權限,也可能是要訪問的成員根本不存在(類與類之間調用時常用)

  •  IndexOutOfException-------該類用于處理下標超出了數(shù)組長度所引發(fā)的異常

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

  • try 塊包含的代碼組成了程序的正常操作部分,但這部分程序可能會遇到某些嚴重的錯誤。

  • catch塊包含的代碼處理各種錯誤,這些錯誤是執(zhí)行try塊中的代碼時遇到的問題。這個快可以用來記錄錯誤。

  • finally快包含的代碼清理資源或執(zhí)行通常要在try塊或者catch塊末尾執(zhí)行的其他操作。無論是否拋出異常,都會執(zhí)行finally塊。finally塊中防止return語句,編譯器會標記一個錯誤。另外此塊可以如果沒有需要關閉或者處理的其他操作可以省略此塊。 

異常處理具有性能含義,在常見的情況下,不應該使用異常處理錯誤。應盡量編寫好避免錯誤出現(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ù)字不在此范圍內.{ex.Message}");
  }
  catch (Exception ex)
  {

   Console.WriteLine(ex.Message);
  }
  finally
  {
   Console.WriteLine("謝謝合作");
  }

  
  }
 }
 }

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

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

屬性

說明

Data

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

HelpLink

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

InnerException

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

Message

描述錯誤情況的文本

Source

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

StackTrace

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

Hresult

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

TargetSite

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

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

自從C#6開始就支持異常過濾器。Catch塊僅在過濾器但會true時執(zhí)行。捕獲不同的異常類型時,可以有行為不同的代碼塊。在某些情況下,catch塊基于異常的內容執(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,以此啦作為過濾條件,利用關鍵字When+條件來進行過濾。

感謝各位的閱讀!關于“.NET錯誤與異常處理機制的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI