无论内部最终块是什么(几乎)始终执行,那么将代码封装到其中或将其保持未封闭之间的区别是什么?
无论是否存在异常,finally块中的代码都将被执行.这对于某些内务处理功能非常方便,您需要始终像关闭连接那样运行.
现在,我猜你的问题是为什么你应该这样做:
try { doSomething(); } catch { catchSomething(); } finally { alwaysDoThis(); }
什么时候可以这样做:
try { doSomething(); } catch { catchSomething(); } alwaysDoThis();
答案是很多时候catch语句中的代码会重新抛出异常或者中断当前函数.用后面的代码,"alwaysDoThis();" 如果catch语句中的代码发出返回或抛出新异常,则调用将不会执行.
使用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). }
此行为使其在各种情况下非常有用,尤其是当您需要执行清理(处置资源)时,尽管在这种情况下使用块通常更好.
任何时候你使用非托管代码请求,如流读取器,数据库请求等; 并且你想捕获异常然后使用try catch finally并在最后关闭流,数据读取器等,如果你没有当它出错时连接没有被关闭,这对db请求来说真的很糟糕
SqlConnection myConn = new SqlConnection("Connectionstring"); try { myConn.Open(); //make na DB Request } catch (Exception DBException) { //do somehting with exception } finally { myConn.Close(); myConn.Dispose(); }
如果您不想捕获错误,请使用
using (SqlConnection myConn = new SqlConnection("Connectionstring")) { myConn.Open(); //make na DB Request myConn.Close(); }
如果出现错误,连接对象将自动处理,但您不会捕获错误
因为即使你没有在catch块中处理异常,最终也会被执行.
finally
,如:
try { // do something risky } catch (Exception ex) { // handle an exception } finally { // do any required cleanup }
try..catch
无论您的try块是否引发异常,都可以保证在阻止后执行代码.
这使得它非常适合发布资源,数据库连接,文件句柄等.
最后语句甚至可以在返回后执行.
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 }