使用異常物件
你可以在自己的程式碼中建立和丟擲異常。例項化異常的方式與任何其他 C#物件相同。
Exception ex = new Exception();
// constructor with an overload that takes a message string
Exception ex = new Exception("Error message");
然後,你可以使用 throw
關鍵字來引發異常:
try
{
throw new Exception("Error");
}
catch (Exception ex)
{
Console.Write(ex.Message); // Logs 'Error' to the output window
}
注意: 如果你在 catch 塊中丟擲新異常,請確保將原始異常作為內部異常傳遞,例如
void DoSomething()
{
int b=1; int c=5;
try
{
var a = 1;
b = a - 1;
c = a / b;
a = a / c;
}
catch (DivideByZeroException dEx) when (b==0)
{
// we're throwing the same kind of exception
throw new DivideByZeroException("Cannot divide by b because it is zero", dEx);
}
catch (DivideByZeroException dEx) when (c==0)
{
// we're throwing the same kind of exception
throw new DivideByZeroException("Cannot divide by c because it is zero", dEx);
}
}
void Main()
{
try
{
DoSomething();
}
catch (Exception ex)
{
// Logs full error information (incl. inner exception)
Console.Write(ex.ToString());
}
}
在這種情況下,假設無法處理異常,但是將一些有用的資訊新增到訊息中(原始異常仍然可以通過外部異常塊通過 ex.InnerException
訪問)。
它將顯示如下內容:
System.DivideByZeroException:不能除以 b 因為它為零 —> System.DivideByZeroException:試圖除以零。
在 C:[…] \ LINQPadQuery.cs 中的UserQuery.g__DoSomething0_0()
:第 36 行
-–內部異常堆疊跟蹤結束 —
在 C:[…] \ LINQPadQuery 中的UserQuery.g__DoSomething0_0()
處。cs:
C 中的UserQuery.Main()
第 42 行 :[…] \ LINQPadQuery.cs:第 55 行
如果你在 LinqPad 中嘗試此示例,你會注意到行號不是很有意義(它們並不總能幫助你)。但是,如上所述傳遞有用的錯誤文字通常會顯著縮短跟蹤錯誤位置的時間,這在本例中顯然是行
c = a / b;
在功能 DoSomething()
。