try catch finally 块是如何工作的?

Posted

技术标签:

【中文标题】try catch finally 块是如何工作的?【英文标题】:How does the try catch finally block work? 【发布时间】:2012-11-12 18:31:21 【问题描述】:

C# 中,

所以如果出现异常,我知道它会跳转到catch块,然后跳转到finally块。

但是如果没有错误,catch 块不会运行,但是 finally 块会运行吗?

【问题讨论】:

@MatíasFidemraizer:我完全赞成实验——但这并不一定能告诉你语言的保证。您可能会通过实验“发现”各种不可靠的东西。 @JonSkeet 我说的是笼统的说法,而不是关于你自己的建议(你的链接),但我的意思是检查 try/catch/finally 在 C# 中的工作方式是你可以发现的东西此代码:try catch finally Trace.WriteLine("I'm here!"); 例如 :) @MatíasFidemraizer:但这就是我的观点——它向你展示了它在这种特殊情况下的作用——但它并没有告诉你如果(比如说)你在 try 块内返回会发生什么.是的,实验是好的——但我通常更愿意在可能的情况下相信规范。 @JonSkeet 100% 同意。我总是喜欢阅读文档页面并了解某些语言或 API 功能的确切行为。但我的意思是,如果不阅读所谓的文档或至少尝试自己的示例代码,我不会在论坛或 SO 上提问。但同样,100% 同意,规范 > 试错。 当一个返回执行控制/程序辉光返回给执行该方法或函数的脚本、函数或方法。这意味着在被调用函数内部返回之后的任何内容都不会执行。因此,如果您在一行中有一个返回,并且说下一行有一个异常,它将不会执行该异常。如果没有返回,异常会触发,catch 会捕获它们,如果你使用 finally 块,那么它将执行其中的任何内容。退出、清理、返回,无论你真正想要什么,但实际上最好在需要时执行清理,而不是其他。 【参考方案1】:

finally 块将始终在方法返回之前执行。

尝试运行下面的代码,您会注意到finally 语句中的Console.WriteLine("executed")Console.WriteLine(RunTry()) 有机会执行之前执行。

static void Main(string[] args)

    Console.WriteLine("Hello World!");
    Console.WriteLine(RunTry());
    Console.ReadLine();

public static int RunTry()

    try
    
        throw new Exception();
    
    catch (Exception)
    
        return 0;
    
    finally
    
        Console.WriteLine("executed");
    
    Console.WriteLine("will not be executed since the method already returned");

查看结果:

【讨论】:

【参考方案2】:

是的,Finally 总是会执行。

即使try后没有catch块,finally块还是会执行

finally 基本上可以用来释放文件流、数据库连接和图形处理程序等资源,而无需等待运行时中的垃圾收集器完成对象。

       try
        
            int a = 10;
            int b = 0;
            int x = a / b;
        
        catch (Exception e)
        
            Console.WriteLine(e);
        
        finally
        
            Console.WriteLine("Finally block is executed");
        
        Console.WriteLine("Some more code here");

输出:

System.DivideByZeroException:试图除以零。

最终块被执行

其余代码

来源:Exception handling in C# (With try-catch-finally block details)

【讨论】:

【参考方案3】:
        try
        
            //Function to Perform
        
        catch (Exception e)
        
         //You can display what error occured in Try block, with exact technical spec (DivideByZeroException)
            throw; 
            // Displaying error through signal to Machine, 
            //throw is usefull , if you calling a method with try from derived class.. So the method will directly get the signal                
        

        finally  //Optional
        
            //Here You can write any code to be executed after error occured in Try block
            Console.WriteLine("Completed");
        

【讨论】:

finally 总是被执行,无论catch 是否捕获错误。【参考方案4】:

finally 块总是运行,无论如何。 试试这个方法

     public int TryCatchFinally(int a, int b)
    
        try
        
            int sum = a + b;
            if (a > b)
            
                throw new Exception();
            
            else
            
                int rightreturn = 2;
                return rightreturn;
            
        
        catch (Exception)
        
            int ret = 1;
            return ret;
        
        finally
        
            int fin = 5;
        
    

【讨论】:

【参考方案5】:

是的,不管有没有异常,finally 块都会运行。

尝试 [尝试语句] [退出尝试] [捕捉[异常[作为类型]][当表达式] [捕捉语句] [退出尝试]] [ 抓住 ... ] [ 最后 [ finallyStatements ] ] --始终运行 结束尝试

见:http://msdn.microsoft.com/en-us/library/fk6t46tz%28v=vs.80%29.aspx

【讨论】:

FINALLY 块的意义何在?无论如何都不会执行 TRY 块之外的下一行吗?为什么要费心最后呢? 旧帖子/cmets。 @Doug - 我的实例是记录任何 API 调用,无论是否有错误。因此,finally 开始发挥作用,而不是在 try 块中使用 (2) "log" 调用,然后是 catch。 如果您返回 try/catch 中的方法,则 try-catch-finally 语句之外的任何代码都不会执行,但 finally 语句会。请在此处查看我的其他答案 @Doug - TRY 块外的下一行不会被执行,一个异常是从 CATCH 块内抛出的,或者如果你打算从块内返回,所以你使用 FINALLY 块放置在这种情况下必须运行的代码。【参考方案6】:

是的,如果没有异常,finally 子句就会被执行。 举个例子

     try
        
            int a = 10;
            int b = 20;
            int z = a + b;
        
        catch (Exception e)
        
            Console.WriteLine(e.Message);
        
        finally
        
            Console.WriteLine("Executed");
        

因此,如果假设发生异常,finally 也会被执行。

【讨论】:

以上是关于try catch finally 块是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Finally语句块的运行

try-catch-finally 后返回

异常和TCP通讯

Java Try Catch finally 没有 Catch 的块

java中 在一个异常处理中啥语句块是可多个的

JAVA学习第十九课(java程序的异常处理 )