无论finally块中的内容是什么,它总是被执行(几乎),那么将代码封闭到它或不封闭它之间有什么区别呢?
当前回答
如文档中所述:
catch和finally的一个常见用法是在try块中获取和使用资源,在catch块中处理异常情况,并在finally块中释放资源。
同样值得一读的是:
一旦找到匹配的catch子句,系统就准备将控制转移到catch子句的第一个语句。在catch子句开始执行之前,系统首先按顺序执行所有与try语句关联的finally子句,这些语句的嵌套比捕获异常的语句嵌套多。
因此很明显,即使前面的catch子句有return语句,驻留在finally子句中的代码也将被执行。
其他回答
使用try-finally的大多数优点已经指出了,但我想再加上这一点:
try
{
// Code here that might throw an exception...
if (arbitraryCondition)
{
return true;
}
// Code here that might throw an exception...
}
finally
{
// Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}
这种行为使它在各种情况下都非常有用,特别是当您需要执行清理(处置资源)时,尽管在这种情况下使用块通常更好。
finally块对于清理try块中分配的任何资源以及运行即使出现异常也必须执行的任何代码很有价值。无论try块如何退出,控件总是传递给finally块。
最后,语句甚至可以在返回后执行。
private int myfun()
{
int a = 100; //any number
int b = 0;
try
{
a = (5 / b);
return a;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return a;
}
// Response.Write("Statement after return before finally"); -->this will give error "Syntax error, 'try' expected"
finally
{
Response.Write("Statement after return in finally"); // --> This will execute , even after having return code above
}
Response.Write("Statement after return after finally"); // -->Unreachable code
}
最后,如:
try {
// do something risky
} catch (Exception ex) {
// handle an exception
} finally {
// do any required cleanup
}
是try. catch块之后执行代码的保证机会,而不管try块是否抛出异常。
这使得它非常适合于释放资源、db连接、文件句柄等。
无论是否存在异常,finally块中的代码都将被执行。当涉及到某些需要经常运行的内务功能(如关闭连接)时,这非常方便。
现在,我猜你的问题是你为什么要这样做:
try
{
doSomething();
}
catch
{
catchSomething();
}
finally
{
alwaysDoThis();
}
什么时候你可以这样做:
try
{
doSomething();
}
catch
{
catchSomething();
}
alwaysDoThis();
答案是,catch语句中的代码很多时候要么会重新抛出异常,要么会跳出当前函数。对于后一种代码,如果catch语句内的代码发出返回或抛出新异常,则“alwaysDoThis();”调用将不会执行。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- Java 8: Lambda-Streams,过滤方法与异常
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?