1. 程式人生 > 其它 >.NET中異常類(Exception)

.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的異常處理機制。比如字串轉換成數字,應該在轉換之前判斷是否符合格式要求,而不是直接轉換。

轉自:https://www.cnblogs.com/alvin-niu/p/6690840.html

  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的異常處理機制。比如字串轉換成數字,應該在轉換之前判斷是否符合格式要求,而不是直接轉換。

轉自:https://www.cnblogs.com/alvin-niu/p/6690840.html