異常是程式設計語言的一個強大特性,能減少複雜性代碼,并且減少了的編寫和維護的代碼數量。
盡量用值的方式抛出異常,用引用來捕捉異常。
例如:
void Test(Item item)
{
try
{
if (/* some test failed */)
{
throw _com_error(E_FAIL);
}
}
catch(_com_error& comError)
{
// Process comError
//
}
}
大家對這個更眼熟了吧:
try
{
...
}
catch(System.Exception e)
{
...
}
異常存在系統的每一刻,你不察覺或是沒有抛出而已。你不應抓住錯誤用沒有具體指定的異常,如
System.Exception, System.SystemException 等等的基類通用的異常,C#本身代碼異常。
而你應該更多地去捕捉 最可能得到的異常 (有意義的異常),例如當可能會遇到空參數時抛出ArgumentNullException
而不是其基類的異常 ArgumentException。
或者你可以在最後的catch塊中重新抛出通用的異常。
抛出 System.Exception 和捕捉 System.Exception 總是一件錯誤的事,你可以“ 偷懶” 地這樣,一旦那個方法沒有正确地運作,
你得花很多功夫去找那個錯誤。
例子:
// Good:
try
{
...
}
catch(System.NullReferenceException exc)
{
...
}
catch(System.ArgumentOutOfRangeException exc)
{
...
}
catch(System.InvalidCastException exc)
{
...
}
//Bad:
try
{
...
}
catch (Exception ex)
{
...
}
當捕捉和重新抛出一個異常時,比較好的方法是抛出一個空 throw。這是很好的方法來保護異常調用堆棧資訊。
例子:
//Good:
try
{
... // Do some reading with the file
}
catch
{
file.Position = position; // Unwind on failure
throw; // Rethrow
}
//Bad:
try
{
... // Do some reading with the file
}
catch (Exception ex)
{
file.Position = position; // Unwind on failure
throw ex; // Rethrow
}
最後, 異常類 閱兵儀式:
Exception:所有異常對象的基類。
SystemException:運作時産生的所有錯誤的基類。
IndexOutOfRangeException:當一個數組的下标超出範圍時運作時引發。
NullReferenceException:當一個空對象被引用時運作時引發。
InvalidOperationException:當對方法的調用對對象的目前狀态無效時,由某些方法引發。
ArgumentException:所有參數異常的基類。
ArgumentNullException:在參數為空(不允許)的情況下,由方法引發。
ArgumentOutOfRangeException:當參數不在一個給定範圍之内時,由方法引發。
InteropException:目标在或發生在CLR外面環境中的異常的基類。
ComException:包含COM類的HRESULT資訊的異常。
SEHException:封裝Win32結構異常處理資訊的異常。
SqlException:封裝了SQL操作異常。
常見具體的異常對象:
ArgumentNullException 一個空參數傳遞給方法,該方法不能接受該參數
ArgumentOutOfRangeException 參數值超出範圍
ArithmeticException 出現算術上溢或者下溢
ArrayTypeMismatchException 試圖在數組中存儲錯誤類型的對象
BadImageFormatException 圖形的格式錯誤
DivideByZeroException 除零異常
DllNotFoundException 找不到引用的DLL
FormatException 參數格式錯誤
IndexOutOfRangeException 數組索引超出範圍
InvalidCastException 使用無效的類
InvalidOperationException 方法的調用時間錯誤
NotSupportedException 調用的方法在類中沒有實作
NullReferenceException 試圖使用一個未配置設定的引用
OutOfMemoryException 記憶體空間不夠
StackOverflowException 堆棧溢出
轉載于:https://www.cnblogs.com/beckson/archive/2010/12/09/1901485.html