【发布时间】:2019-03-31 08:13:54
【问题描述】:
我对 C# 中如何抛出异常感到很困惑。如果发生异常,在 try 块中, 1.它被扔到catch块, 2. 当且仅当 catch 块捕获它时,才会执行 finally 块。 3. finally 块最后执行,前提是 catch 语句捕获了它。
但是,当我尝试运行下面的程序时,输出是A,B而不是BA。我的理解有什么问题吗?谢谢。
class Program
{
public static void Main(string[] args)
{
try
{
int a = 2;
int b = 10 / a;
try
{
if (a == 1)
a = a / a - a;
if (a == 2)
{
int[] c = { 1 };
c[8] = 9;
}
}
finally
{
Console.WriteLine("A");
}
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("B");
}
Console.ReadLine();
}
}
异常发生在a==2,我知道外层catch会捕获这个异常。但是,finally 是先执行的吗?为什么会出现这种情况?
已编辑
从 C# 文档中我们知道,无论是否发生异常,都将执行 finally 块。
但是,我的 finally 块永远不会被执行,作为回报,我得到了一个运行时错误
class Program
{
public static void Main(string[] args)
{
try
{
int a = 2;
int b = 10 / a;
try
{
if (a == 1)
a = a / a - a;
if (a == 2)
{
int[] c = { 1 };
c[8] = 9;
}
}
finally
{
Console.WriteLine("A");
}
}
finally{
Console.WriteLine("finally");
}
Console.ReadLine();
}
}
【问题讨论】:
-
最终将始终独立执行,您是否处理异常。因此,如果异常是 IndexOutOfRangeException 类型,您将始终在控制台中看到
A和B。 -
Specification:一旦找到匹配的
catch子句,系统就准备将控制权转移到catch子句的第一条语句。在开始执行catch子句之前,系统首先按顺序执行与try语句关联的任何finally子句,其嵌套程度比捕获异常的语句的嵌套程度高。 -
您的编辑与我回答的后半部分有关,其中根本找不到异常处理程序。
-
似乎有人对每个答案都投了反对票。留下评论来解释原因会很有帮助
-
However, my finally block never gets executed and in return I am getting a run time error这不是真的。它们被执行并且你在运行时得到未处理的异常错误。见这里:Test。可以看到A最后打印出来然后异常。
标签: c# exception-handling