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 块是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章