最后在c#中阻止

时间:2011-02-01 08:34:20

标签: c# exception-handling try-catch-finally

  

可能重复:
  Finally Block Not Running??

我对c#中的finally块有疑问。 我写了一个小样本代码:

public class MyType
{
    public void foo()
    {
        try
        {
            Console.WriteLine("Throw NullReferenceException?");
            string s = Console.ReadLine();
            if (s == "Y")
                throw new NullReferenceException();
            else
                throw new ArgumentException();          
        }
        catch (NullReferenceException)
        {
            Console.WriteLine("NullReferenceException was caught!");
        }
        finally
        {
            Console.WriteLine("finally block");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyType t = new MyType();
        t.foo();
    }
}

据我所知,最后阻塞假设确定性地运行,无论是否抛出异常。 现在,如果用户输入“Y” - 抛出NullReferenceException,则执行移动到catch时钟,然后移动到finally块,如我所料。 但如果输入是其他东西 - 抛出ArgumentException。没有合适的catch块来捕获这个异常,所以我认为执行应该移动finally块 - 但它没有。有人可以解释一下为什么吗?

谢谢大家:)

2 个答案:

答案 0 :(得分:6)

您的调试器可能正在捕获ArgumentException,所以它等待您在进入最终块之前“处理”它。运行没有附加调试器的代码(包括没有你的JIT调试器),它应该命中你的finally块。

要停用JIT,请转到选项>工具>调试>及时并取消选中托管

要调试没有连接的调试器,请在Visual Studio中转到调试>开始时无需调试(或 CTRL + F5

在程序结束时放置Console.ReadLine()以防止控制台在进入finally块后关闭也是有帮助的。

class Program {
    static void Main(string[] args) {
        MyType t = new MyType();
        t.foo();
        Console.ReadLine();
    }
}

以下是您应该得到的输出:


  

抛出NullReferenceException? Ñ

     

未处理的例外情况:   System.ArgumentException:值   不属于预期的范围。

     

在ConsoleSandbox.MyType.foo()中   病人:\文档\沙盒\控制台\控制台\康寿   e \ Program.cs:第17行

     

在   ConsoleSandbox.Program.Main(字符串[]   ar:)在P:\ Documents \ Sandbox \ Console中   \ Console \ Console \ Program.cs:第31行

     

终于阻止

     

按任意键继续。 。

答案 1 :(得分:1)

您看到的是您的测试程序的工件。

如果您更改主要方法:

 static void Main(string[] args)
 {
    try
    {
        MyType t = new MyType();
        t.foo();
    }
    catch
    {
       // write something
    }
 }

然后您的foo()将按预期行事。

如果没有尝试使用try / catch,整个程序就会被中止。