如果我不在 try 块中抛出异常会发生什么?
如果你不抛出异常,并且没有引发其他异常,catch 块将不会运行。代码将跳过 catch 块并继续执行之后的任何内容(包括 finally 块,如果有的话)。
想象一下,try 块中有代码生成异常但 try 块没有 throw 语句的情况。
catch 块仍将运行...当且仅当异常的 type 与 catch 块声明的类型匹配时。让我们看几个例子。首先是这个示例:
try
{
double x = 1 / 0.0;
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
在这种情况下,我们有导致DivideByZeroException 异常的代码。由于这与 catch 块中使用的类型匹配,因此异常处理程序将运行。
接下来:
try
{
double x = 1 / 0.0;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
我们仍然有一个DivideByZeroException 异常...但是由于DivideByZeroException 继承自基本Exception 类型,因此仍然兼容并且catch 块将运行。
另一个:
try
{
double x = 1 / 0.0;
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
我们仍然有一个DivideByZeroException 异常,但这次catch 块不兼容。在这种情况下,程序将因未处理的异常而崩溃(除非此异常在程序堆栈中的其他位置处理)。
还有一个:
try
{
double x = 1 / 0.0;
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
两个catch 块!第一个块不会运行,因为它与DivideByZeroException 类型不兼容。但是,第二个catch 块将运行,因为它是兼容的。异常处理完毕,程序可以继续运行。
最后:
double DbyZ(double numerator)
{
try
{
return numerator / 0.0;
}
catch(InvalidOperationException ex)
{
Console.WriteLine("Invalid operation");
}
}
...
try
{
DbyZ(1.0);
}
catch(Exception ex)
{
Console.WriteLine("Exception");
}
这一次,输出将是简单的"Exception"。请记住,您不必总是在引发异常的地方捕获异常。
如果您对给定案例中可能发生的情况仍有疑问,请创建自己的样本来测试案例并查看。