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