.NET中異常類(Exception)


  異常:程序在運行期間發生的錯誤。異常對象就是封裝這些錯誤的對象。

  try{}catch{}是非常重要的,捕獲try程序塊中所有發生的異常,如果沒有捕獲異常的話,程序運行的線程將會掛掉,更嚴重的是這些錯誤有可能會直接拋給用戶,讓用戶看到。所以說在程序的最外層必須要有捕獲異常的程序。這樣至少確保程序的正常運行。還有一點就是,捕獲異常之后需要記錄下來,這樣對於我們排查問題也是有幫助的。

  什么情況下,不需要捕獲異常呢?

  1.發生此類錯誤的時候,就沒必要執行之后的代碼的時候,就可以拋出異常了。

  2.在開發封裝類,並且發生的錯誤需要讓調用者知道的時候,就可以拋出異常了。

 

Exception類:

  翻譯自:https://msdn.microsoft.com/en-us/library/804f22sf(v=vs.110).aspx

構造函數:4個重載,Exception()、Exception(SerializationInfo, StreamingContext)、Exception(String)、Exception(String, Exception)。

Exception():創建一個異常的實例,異常實例中所有的字段都需要手動再加,初次創建都是默認值。

Exception(SerializationInfo, StreamingContext):暫時不懂。

Exception(String message):創建一個帶有錯誤信息的異常實例。message表示異常信息。

Exception(String message, Exception ex):創建一個異常實例,並為該異常賦值錯誤信息,如果有內部異常,也一起傳進去。如果沒有內部異常就傳輸null。

屬性

屬性名 類型 解釋
Data IDictionary 獲取除了異常信息以外,自定義異常的鍵值對的集合
HelpLink String 獲取或設置一個跟異常相關聯的幫助文檔的地址
HResult int 獲取或設置一個特定異常的代碼
InnerException Exception 獲取當前異常內部的異常實例
Message String 獲取異常的錯誤信息
Source String 獲取或設置當前異常發生在那個應用程序中
StackTrace String Gets a string representation of the immediate frames on the call stack.
TargetSite MethodBase 獲取當前異常發生的方法

異常類實例方法

Equals(Object object):確定object是否與當前的對象相等。

ToString():把Exception對象轉換成字符串,按照指定的格式顯示。對Object.ToString () 方法進行重寫。

Finalize():允許用戶在垃圾回收機制回收之前,釋放資源或者清除操作行為。

GetBaseException():在被繼承類重寫時,返回一個異常或隨后的多個異常。

GetHashCode():作為默認的散列函數。

GetType():返回當前實例運行時的類型。

MemberwiseClone():淺復制當前的對象。

 常用的異常類型

 

異常類型 描述
ArgumentException 方法中傳進一個非空參數是無效的
ArgumentNullException 方法中傳進一個空參數
ArgumentOutOfRangeException 傳入的參數超出了有效值的范圍
DirectoryNotFoundException 找不到相關目錄
DivideByZeroException 分子或分母為0
DriverNotFoundException 驅動無效或者找不到相關驅動
FileNotFoundException 找不到相關文件(文件不存在)
FormatException 格式轉換出錯,一個類型轉換到另外一個類型的時候,格式不一致
IndexOutOfRangeException 索引超出集合的范圍
InvalidOperationException 當前操作對象的狀態是無效的
KeyNotFoundException 集合中並沒有找到對應的鍵
NotImplementedException 方法或操作沒有被實現
NotSupportedException 不支持該方法或操作
ObjectDisposedException 在一個操作上執行一個對象時,發現該對象已經被處理了
OverFlowException 在算法、內存操作,類型轉換的時候發生內存溢出
PathTooLongException 一個目錄或者文件超出了系統定義的最大長度
PlatformNotSupportedException 當前運行環境不支持該操作
RankException 方法中傳進了錯誤的數組維數
TimeoutException 操作超時
UIFormatException 一個無效的統一資源標識符

 

例子

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace TestBLL
{
    public class ExceptionTest
    {
        public static void Option(string argument1, int argument2)
        {
            try
            {
                if (argument1 == null)
                {
                    throw new ArgumentNullException("參數為空值");
                }
                string result = argument1;
                if (argument2 == 101)//如果argument2值為101時,拋出參數無效的異常
                {
                    throw new ArgumentException("參數無效");
                }
                if (argument2 > 100)
                {
                    throw new ArgumentOutOfRangeException("參數超出了指定的范圍");
                }
                if (!Directory.Exists("D:\\Test"))
                {
                    throw new DirectoryNotFoundException("該目錄不存在");
                }
                if (argument2 == 0)
                {
                    throw new DivideByZeroException("分母不能為0");
                }
                int num = 10 / argument2;

                string path = @"C:\WINDOWS\system32\drivers\UsbCamIF.sys"; //驅動的默認安裝地址
                if (!File.Exists(path))
                {
                    throw new DriveNotFoundException("未找到相關驅動程序");
                }
                if (!File.Exists("D:\\Test\\test.txt"))
                {
                    throw new FileNotFoundException("該文件路徑不存在");
                }
                if (Regex.Match(argument1, "\\D").Success)//如果字符中存在非數字字符,在String類型轉換成int類型的時候拋出異常
                {
                    throw new FormatException("無法轉換類型");
                }
                num = int.Parse(argument1);
                List<string> list = new List<string>() { "123", "456" };
                if (num > list.Count - 1)
                {
                    throw new IndexOutOfRangeException("索引超出了集合的范圍");
                }
                string indexStr = list[num];
                Dictionary<int, string> dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "456" } };
                if (!dic.Keys.Contains(num))
                {
                    throw new KeyNotFoundException("並為找到相應的鍵");
                }
                result = dic[num];
            }
            catch (Exception e)
            {
                e.HelpLink = "https://msdn.microsoft.com/en-us/library/system.exception(v=vs.110).aspx";
                e.Source = "Test";
                throw new Exception("方法中出現異常",e);//在此處捕獲所有的異常,並統一拋出去
            }
        }
    }
}
異常類實例

 

注意:如果自己能判斷的異常或者錯誤,就不要交由.net的異常處理機制。比如字符串轉換成數字,應該在轉換之前判斷是否符合格式要求,而不是直接轉換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM