Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为什么赢了';“我的”;最后";跑_C# 4.0_Try Catch Finally - Fatal编程技术网

C# 4.0 为什么赢了';“我的”;最后";跑

C# 4.0 为什么赢了';“我的”;最后";跑,c#-4.0,try-catch-finally,C# 4.0,Try Catch Finally,我想我遗漏了一些非常琐碎的东西,但出于某种原因,我并不清楚。我一直假设“finally”总是执行,不管是否有异常 无论如何,这段代码无法运行,我不知道为什么。它到达i=i/j并抛出一个DivideByZero异常,但我认为它会继续并在停止之前执行finally语句 static void Main(string[] args) { int i = 1; try { int j = 0; i = i / j; Consol

我想我遗漏了一些非常琐碎的东西,但出于某种原因,我并不清楚。我一直假设“finally”总是执行,不管是否有异常

无论如何,这段代码无法运行,我不知道为什么。它到达i=i/j并抛出一个DivideByZero异常,但我认为它会继续并在停止之前执行finally语句

static void Main(string[] args)
{
    int i = 1;

    try
    {
        int j = 0;
        i = i / j;

        Console.WriteLine("can't get");
    }
    finally
    {
        Console.WriteLine("finally ran");
    }
}

对我来说很有用——至少有点。当我从命令行将其作为控制台应用程序运行时,“Test.exe已停止工作。Windows正在寻找解决方案”对话框立即出现,但如果我点击“取消”按钮,我会看到“最终运行”。如果我让初始对话框运行到完成,只剩下Debug或Close,那么点击Close将立即终止进程,点击Debug显然会打开一个调试器

编辑:更详细地解释行为。我将保留这个答案,因为它包含实验结果,但看看马克的答案:)

试试这个:

static void Main(string[] args)
     {
        int i = 1;

    try
    {
        int j = 0;
        i = i / j;

        Console.WriteLine("can't get");
    }
    catch(Exception ex){
        Console.WriteLine(ex.Message);
     }
    finally
    {
        Console.WriteLine("finally ran");
    }
    Console.WriteLine("Press enter to exit...");
    Console.ReadLine();
}

看看这个

从以上链接:

通常,当未处理的异常结束应用程序时,无论 最后一个块是否运行并不重要。然而,如果你有 finally块中即使在这种情况下也必须运行的语句, 一种解决方案是向try finally语句添加catch块

马克的回答说明了发生了什么,但我想我应该提到原因:

我认为这是为了允许任何外部处理程序在执行
最后
块之前处理异常。(例如,当附加了调试器时,它可以尝试在异常点中断,从而允许您在
最后
块开始运行之前继续。)


如果预先执行了
finally
块,则无法在调试器中处理异常。

我认为在
finally
运行之前,您可能需要一个
catch
来捕获异常。

好,这很奇怪。我正在使用VisualStudio2010Express运行此程序,它出现异常,然后我无法继续。也许我必须改变我的异常处理设置……啊,还有,“寻找解决方案”这件事我也会觉得很奇怪。因为我本以为它只会遇到异常,并在没有提示的情况下继续运行。这是控制台应用程序的行为吗?@stirfry:不是,因为你没有捕捉到异常。它表示程序出现故障,程序无法继续。奇怪!!我一直认为这段代码最终会出现编译时错误。我试过了,它的表现和乔恩·斯基特在回答中提到的一模一样。