SwD*_*n81 10 c# language-features using using-statement
我理解"使用"的意思是保证调用对象的Dispose方法.但是如何处理"使用"语句中的异常呢?如果有异常,我需要在try catch中包装我的"using"语句.例如:
可以说在using参数中创建对象时会创建一个异常
try
{
// Exception in using parameter
using (SqlConnection connection = new SqlConnection("LippertTheLeopard"))
{
connection.Open();
}
}
catch (Exception ex)
{
}
Run Code Online (Sandbox Code Playgroud)
或使用范围内的异常
using (SqlConnection connection = new SqlConnection())
{
try
{
connection.Open();
}
catch (Exception ex)
{
}
}
Run Code Online (Sandbox Code Playgroud)
好像我已经需要使用try catch来处理异常,也许我应该只处理对象的处理.在这种情况下,"使用"声明似乎并没有帮助我.如何使用"using"语句正确处理异常?我错过了更好的方法吗?
SqlConnection connection2 = null;
try
{
connection2 = new SqlConnection("z");
connection2.Open();
}
catch (Exception ex)
{
}
finally
{
IDisposable disp = connection2 as IDisposable;
if (disp != null)
{
disp.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
"使用"关键字语法可能会更加含糖......
这肯定会很好:
using (SqlConnection connection = new SqlConnection())
{
connection.Open();
}
catch(Exception ex)
{
// What went wrong? Well at least connection is Disposed
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*ity 27
因为你会在一个不相关的关键字中"隐藏"额外的功能.
但是你总是可以这样写
using (...) try
{
}
catch (...)
{
}
Run Code Online (Sandbox Code Playgroud)
这种方式表示你的意图 - 一个也是尝试的使用声明
using块只是try-finally块的语法糖.如果你需要一个catch子句,只需使用try-catch-finally:
SqlConnection connection;
try
{
connection = new SqlConnection();
connection.Open();
}
catch(Exception ex)
{
// handle
}
finally
{
if (connection != null)
{
connection.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
是的,这比你的理论"使用 - 捕获"更多的代码; 我判断语言开发人员并不认为这是一个非常重要的问题,我不能说我曾经感受到它的损失.
我有过这个有用的地方.但更常见的是,当我想要这样做时,事实证明问题出在我的设计中; 我正试图在错误的地方处理异常.
相反,我需要允许它上升到下一个级别 - 在调用此代码的函数中处理它,而不是在那里.