一些簡單的異常處理基礎知識總結(僅供參考)html
(一).NET的異常處理方式: 數組
發生異常時,系統將搜索能夠處理該異常的最近的 catch 子句(根據該異常的運行時類型來肯定)。首先,搜索當前的方法以查找一個詞法上包含着它的 try 語句,並按順序考察與該 try 語句相關聯的各個 catch 子句。若是上述操做失敗,則在調用了當前方法的方法中,搜索在詞法上包含着當前方法調用代碼位置的 try 語句。此搜索將一直進行下去,直到找到能夠處理當前異常的 catch 子句(該子句指定一個異常類,它與當前引起該異常的運行時類型屬於同一個類或是該運行時類型所屬類的一個基類)。注意,沒有指定異常類的 catch 子句能夠處理任何異常。ide
找到匹配的 catch 子句後,系統將把控制轉移到該 catch 子句的第一條語句。在 catch 子句的執行開始前,系統將首先按順序執行嵌套在捕捉到該異常的 try 語句裏面的全部 try 語句所對應的所有 finally 子句。測試
(1).try塊:包含的代碼一般須要執行一些通用的資源清理操做,或者須要從異常中恢復,或者二者都須要。try塊還能夠包含也許會拋出異常的代碼。ui
(2).catch塊:包含的是響應一個異常須要執行的代碼。若是沒有任何捕捉類型與拋出的異常匹配,CLR會去調用棧的更高一層搜索一個與異常匹配的捕捉類型。this
(3).finally塊:包含的代碼是保證會執行的代碼。finally塊全部代碼執行完畢後,線程退出finally塊,執行緊跟在finally塊以後的語句。spa
語法線程
假設一個塊將出現異常,一個方法使用 try 和 catch 關鍵字捕獲異常。try/catch 塊內的代碼爲受保護的代碼,使用 try/catch 語法以下所示:code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
try
{
// 引發異常的語句
}
catch
(ExceptionName e1)
{
// 錯誤處理代碼
}
catch
(ExceptionName e2)
{
// 錯誤處理代碼
}
catch
(ExceptionName eN)
{
// 錯誤處理代碼
}
finally
{
// 要執行的語句
}
|
(二).Exception的經常使用屬性的源碼解析:orm
(1).Message:包含輔助性文字說明,指出拋出異常的緣由。
public virtual String Message { get { if (_message == null) { if (_className==null) { _className = GetClassName(); } return Environment.GetRuntimeResourceString("Exception_WasThrown", _className); } else { return _message; } } }
(2).Data:對一個「鍵/值對」集合的引用。
public virtual IDictionary Data { [System.Security.SecuritySafeCritical] // auto-generated get { if (_data == null) if (IsImmutableAgileException(this)) _data = new EmptyReadOnlyDictionaryInternal(); else _data = new ListDictionaryInternal(); return _data; } }
(3).Source:包含生成異常的程序集名稱。
public virtual String Source { #if FEATURE_CORECLR [System.Security.SecurityCritical] // auto-generated #endif get { if (_source == null) { StackTrace st = new StackTrace(this,true); if (st.FrameCount>0) { StackFrame sf = st.GetFrame(0); MethodBase method = sf.GetMethod(); Module module = method.Module; RuntimeModule rtModule = module as RuntimeModule; if (rtModule == null) { System.Reflection.Emit.ModuleBuilder moduleBuilder = module as System.Reflection.Emit.ModuleBuilder; if (moduleBuilder != null) rtModule = moduleBuilder.InternalModule; else throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject")); } _source = rtModule.GetRuntimeAssembly().GetSimpleName(); } } return _source; } #if FEATURE_CORECLR [System.Security.SecurityCritical] // auto-generated #endif set { _source = value; } }
(四).異常處理的經常使用方法:
(1).提取異常及其內部異常堆棧跟蹤
/// <summary> /// 提取異常及其內部異常堆棧跟蹤 /// </summary> /// <param name="exception">提取的例外</param> /// <param name="lastStackTrace">最後提取的堆棧跟蹤(對於遞歸), String.Empty or null</param> /// <param name="exCount">提取的堆棧數(對於遞歸)</param> /// <returns>Syste.String</returns> public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1) { var ex = exception; const string entryFormat = "#{0}: {1}\r\n{2}"; //修復最後一個堆棧跟蹤參數 lastStackTrace = lastStackTrace ?? string.Empty; //添加異常的堆棧跟蹤 lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace); if (exception.Data.Count > 0) { lastStackTrace += "\r\n Data: "; foreach (var item in exception.Data) { var entry = (DictionaryEntry)item; lastStackTrace += string.Format("\r\n\t{0}: {1}", entry.Key, exception.Data[entry.Key]); } } //遞歸添加內部異常 if ((ex = ex.InnerException) != null) return ex.ExtractAllStackTrace(string.Format("{0}\r\n\r\n", lastStackTrace), ++exCount); return lastStackTrace; }
(2).檢查字符串是空的或空的,並拋出一個異常
/// <summary> /// 檢查字符串是空的或空的,並拋出一個異常 /// </summary> /// <param name="val">值測試</param> /// <param name="paramName">參數檢查名稱</param> public static void CheckNullOrEmpty(string val, string paramName) { if (string.IsNullOrEmpty(val)) throw new ArgumentNullException(paramName, "Value can't be null or empty"); }
(3).檢查參數不是無效,並拋出一個異常
/// <summary> /// 檢查參數不是無效,並拋出一個異常 /// </summary> /// <param name="param">檢查值</param> /// <param name="paramName">參數名稱</param> public static void CheckNullParam(object param, string paramName) { if (param == null) throw new ArgumentNullException(paramName, paramName + " can't be null"); }
(4).請檢查參數1不一樣於參數2
/// <summary> /// 請檢查參數1不一樣於參數2 /// </summary> /// <param name="param1">值1測試</param> /// <param name="param1Name">name of value 1</param> /// <param name="param2">value 2 to test</param> /// <param name="param2Name">name of vlaue 2</param> public static void CheckDifferentsParams(object param1, string param1Name, object param2, string param2Name) { if (param1 == param2) { throw new ArgumentException(param1Name + " can't be the same as " + param2Name, param1Name + " and " + param2Name); } }
(5).檢查一個整數值是正的(0或更大)
/// <summary> /// 檢查一個整數值是正的(0或更大) /// </summary> /// <param name="val">整數測試</param> public static void PositiveValue(int val) { if (val < 0) throw new ArgumentException("The value must be greater than or equal to 0."); }
異常處理器(程序):對於程序中出現的異常,在C#中是使用一種被稱爲「異常處理器(程序)」的錯誤捕獲機制來進行處理的, 你能夠認爲異常處理器(程序)就是發生錯誤時,可以接受並處理錯誤的接受者和處理。
(三)C#常見的一些相關異常僅作參考
一、常見異常類
SystemException | 該類是System命名空間中全部其餘異常類的基類。(建議:公共語言運行時引起的異常一般用此類) |
ApplicationException | 該類表示應用程序發生非致命錯誤時所引起的異常(建議:應用程序自身引起的異常一般用此類) |
二、與參數有關的異常類
ArgumentException | 該類用於處理參數無效的異常,除了繼承來的屬性名,此類還提供了string類型的屬性ParamName表示引起異常的參數名稱。 |
FormatException | 該類用於處理參數格式錯誤的異常。 |
三、與成員訪問有關的異常
MemberAccessException | 該類用於處理訪問類的成員失敗時所引起的異常。失敗的緣由可能的緣由是沒有足夠的訪問權限,也多是要訪問的成員根本不存在(類與類之間調用時經常使用) |
FileAccessException | 該類用於處理訪問字段成員失敗所引起的異常 |
MethodAccessException | 該類用於處理訪問方法成員失敗所引起的異常 |
MissingMemberException | 該類用於處理成員不存在時所引起的異常 |
四、與數組有關的異常
IndexOutOfException | 該類用於處理下標超出了數組長度所引起的異常 |
ArrayTypeMismatchException | 該類用於處理在數組中存儲數據類型不正確的元素所引起的異常 |
RankException | 該類用於處理維數錯誤所引起的異常 |
五、與IO有關的異常
IOException | 該類用於處理進行文件輸入輸出操做時所引起的異常。 |
DirectionNotFoundException | 該類用於處理沒有找到指定的目錄而引起的異常。 |
FileNotFoundException | 該類用於處理沒有找到文件而引起的異常。 |
EndOfStreamException | 該類用於處理已經到達流的末尾而還要繼續讀數據而引起的異常。 |
FileLoadException | 該類用於處理沒法加載文件而引起的異常。 |
PathTooLongException | 該類用於處理因爲文件名太長而引起的異常。 |
六、算數相關異常
ArithmeticException | 該類用於處理與算術有關的異常。 |
DivideByZeroException | 表示整數貨十進制運算中試圖除以零而引起的異常。 |
NotFiniteNumberException | 表示浮點數運算中出現無窮打或者非負值時所引起的異常。 |
筆者原文地址:http://www.cnblogs.com/tranw/p/5980490.html
版權聲明:本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
做者:黯淡の青春 博客地址:http://www.cnblogs.com/wuwangqianxun/