使用异常对象
你可以在自己的代码中创建和抛出异常。实例化异常的方式与任何其他 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()
。