使用異常物件

你可以在自己的程式碼中建立和丟擲異常。例項化異常的方式與任何其他 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()

在 .NET 小提琴中試一試