C# 为什么这最终无法执行?
.NET4控制台应用程序示例 当我在VS2010中运行这个时,它似乎一直在投掷(从接球开始),而且永远不会到达终点。它在抛出时中断并显示异常,我点击f5,它几乎像抛出时的循环一样重新旋转。在另一个exe中使用类似的代码,我能够将异常抛出到控制台并执行finally来清理。事实并非如此,我想知道为什么C# 为什么这最终无法执行?,c#,C#,.NET4控制台应用程序示例 当我在VS2010中运行这个时,它似乎一直在投掷(从接球开始),而且永远不会到达终点。它在抛出时中断并显示异常,我点击f5,它几乎像抛出时的循环一样重新旋转。在另一个exe中使用类似的代码,我能够将异常抛出到控制台并执行finally来清理。事实并非如此,我想知道为什么 static void Main(string[] args) { try { throw new Exception("Except
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch(Exception)
{
Console.WriteLine("Catch");
throw;
}
finally
{
Console.WriteLine("Finally");
}
}
相反,它确实执行
finally
块。这是输出:
Catch
Unhandled Exception: System.Exception: Exception at ConsoleApplication1.Program.Main(String[] args) in C:\Desktop\ConsoleApplication1\Program.cs:line 24
Finally
我敢打赌finally确实执行了,但是在控制台应用程序的主方法中,在finally中,控制台对象不再可用。如果我通过调试启动程序,代码将停止并显示消息“unhandled exception”,这是finally将执行之前的消息。在不进行调试的情况下运行将按预期工作(CTRL-F5) 使用调试器,您可以通过将测试代码移动到另一个try-catch块中来验证最终执行的测试代码,例如:
static void Main(string[] args)
{
try
{
Method();
}
catch (Exception)
{
Console.WriteLine("caught in main");
}
Console.ReadKey();
}
public static void Method()
{
try
{
throw new Exception("Exception");
}
catch (Exception)
{
Console.WriteLine("Catch");
throw;
}
finally
{
Console.WriteLine("Finally");
}
}
您可以保证它确实在执行,正如@davidheffernan用他的输出所展示的那样;但是,你可以考虑C语言规范(8.10)中所说的话,以便确信应该是: finally块的语句总是在控制时执行 留下一个try语句。无论控制权是否转移,都是如此 作为正常执行的结果,作为执行 中断、继续、转到或返回语句,或作为 从try语句传播异常
它应该写“Catch”,然后写“Finally”,然后因为异常而崩溃。这不是发生了什么吗?它是循环的,因为在catch语句中,您抛出了相同的异常。@ramhound呃,不,一旦您处于
catch
,那么抛出不会让您回到catch
部分的开头!我同意,我看到了相同的结果。在我的测试中,添加一个断点表明情况就是这样——它肯定会最终命中目标。可能控制台已经停止监听了。我在OP代码的finally块中没有遇到任何问题。