C#使用异常对象

示例

您可以在自己的代码中创建和引发异常。实例化异常的方式与其他C#对象的方式相同。

Exception ex = new Exception();

// 带有消息字符串的重载的构造函数
Exception ex = new Exception("Error message");

然后,您可以使用throw关键字引发异常:

try
{
    throw new Exception("Error");
}
catch (Exception ex)
{
    Console.Write(ex.Message); // 将“错误”记录到输出窗口
}

注意:如果要在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)
    {
        // 我们抛出了同样的异常
        throw new DivideByZeroException("Cannot divide by b because it is zero", dEx);
    }
    catch (DivideByZeroException dEx) when (c==0)
    {
        // 我们抛出了同样的异常
        throw new DivideByZeroException("Cannot divide by c because it is zero", dEx);
    }
}

void Main()
{    
    try
    {
        DoSomething();
    }
    catch (Exception ex)
    {
        // 记录完整的错误信息(包括内部异常)
        Console.Write(ex.ToString()); 
    }    
}

在这种情况下,假定无法处理该异常,但是向消息中添加了一些有用的信息(并且原始异常仍可以通过ex.InnerException外部异常块进行访问)。

它将显示如下内容:

System.DivideByZeroException:无法除以b,因为它为零---> System.DivideByZeroException:试图除以零。
在C:[...] \ LINQPadQuery.cs:行36的UserQuery.g__DoSomething0_0()处
---内部异常堆栈跟踪的结尾---
在C:[...] \ LINQPadQuery的UserQuery.g__DoSomething0_0()处。 CS:线42
在中C:[...] \ LINQPadQuery.cs:55行UserQuery.Main()

如果您在LinqPad中尝试此示例,则会注意到行号不是很有意义(它们并不总是对您有帮助)。但是,按照上面的建议传递有用的错误文本通常会大大减少跟踪错误位置的时间,在此示例中,这显然是

c = a / b;

在功能上DoSomething()。

在.NET Fiddle中尝试