是否需要在try块中明确抛出异常?如果我没有在try块中抛出异常会怎样?
try
{
// code that throws an exception
throw new IndexOutofRangeException;
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine(ex.Message);
}
编辑:具体来说,想象中的情况下,存在这样的try块代码生成一个例外,但try
块并不会有throw
声明。会发生什么?
如果我没有在try块中抛出异常会怎样?
如果您不引发异常,并且没有引发其他异常,则该catch
块将不会运行。该代码将改为跳过catch块,并继续执行随后发生的任何事情(包括该finally
块,如果有的话)。
想象一下在try块中有代码生成异常但try块没有throw语句的情况。
catch块将继续运行......当且仅当该类型的异常被声明的类型相匹配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"
。请记住,您不必总是在引发异常的地方捕获异常。
如果您仍然对某个案例可能发生的事情有疑问,请创建自己的示例以测试案例并查看。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句