Kev*_*ang 394
无论是否存在异常,finally块中的代码都将被执行.这对于某些内务处理功能非常方便,您需要始终像关闭连接那样运行.
现在,我猜你的问题是为什么你应该这样做:
try
{
doSomething();
}
catch
{
catchSomething();
}
finally
{
alwaysDoThis();
}
Run Code Online (Sandbox Code Playgroud)
什么时候可以这样做:
try
{
doSomething();
}
catch
{
catchSomething();
}
alwaysDoThis();
Run Code Online (Sandbox Code Playgroud)
答案是很多时候catch语句中的代码会重新抛出异常或者中断当前函数.用后面的代码,"alwaysDoThis();" 如果catch语句中的代码发出返回或抛出新异常,则调用将不会执行.
Nol*_*rin 60
使用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).
}
Run Code Online (Sandbox Code Playgroud)
此行为使其在各种情况下非常有用,尤其是当您需要执行清理(处置资源)时,尽管在这种情况下使用块通常更好.
Bob*_*tor 11
任何时候你使用非托管代码请求,如流读取器,数据库请求等; 并且你想捕获异常然后使用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();
}
Run Code Online (Sandbox Code Playgroud)
如果您不想捕获错误,请使用
using (SqlConnection myConn = new SqlConnection("Connectionstring"))
{
myConn.Open();
//make na DB Request
myConn.Close();
}
Run Code Online (Sandbox Code Playgroud)
如果出现错误,连接对象将自动处理,但您不会捕获错误
finally,如:
try {
// do something risky
} catch (Exception ex) {
// handle an exception
} finally {
// do any required cleanup
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
我将解释 finally 与文件阅读器异常的使用示例
Run Code Online (Sandbox Code Playgroud)try{ StreamReader strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine(strReader.ReadeToEnd()); StreamReader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); }
在上面的示例中,如果缺少名为Data.txt的文件,则会抛出异常并进行处理,但永远不会执行调用的语句。因为这个与 reader 相关的资源从未被释放。StreamReader.Close();
Run Code Online (Sandbox Code Playgroud)StreamReader strReader = null; try{ strReader = new StreamReader(@"C:\Ariven\Project\Data.txt"); Console.WriteLine(strReader.ReadeToEnd()); } catch (Exception ex){ Console.WriteLine(ex.Message); } finally{ if (strReader != null){ StreamReader.Close(); } }
快乐编码:)
注意: “@”用于创建逐字字符串,以避免“无法识别的转义序列”错误。@ 符号意味着从字面上读取该字符串,否则不解释控制字符。
| 归档时间: |
|
| 查看次数: |
78793 次 |
| 最近记录: |