使用异常对象

你可以在自己的代码中创建和抛出异常。实例化异常的方式与任何其他 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 小提琴中试一试