異常:程序在運行期間發生的錯誤。異常對象就是封裝這些錯誤的對象。
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的異常處理機制。比如字符串轉換成數字,應該在轉換之前判斷是否符合格式要求,而不是直接轉換。