为什么"使用"没有捕获块?

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)

这种方式表示你的意图 - 一个也是尝试的使用声明


Dav*_*sky 12

using与错误处理无关.它是"当你离开这个区块时调用Dispose"的简写.你的第二个代码示例是完全可以接受的...为什么搞乱什么有效?


Mic*_*tta 8

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)

是的,这比你的理论"使用 - 捕获"更多的代码; 我判断语言开发人员并不认为这是一个非常重要的问题,我不能说我曾经感受到它的损失.

  • @ChadNC:显然你不明白`using` - 它会保护你免受异常的影响,并且无论如何都会处理掉这个对象. (2认同)

Joe*_*orn 5

我有过这个有用的地方.但更常见的是,当我想要这样做时,事实证明问题出在我的设计中; 我正试图在错误的地方处理异常.

相反,我需要允许它上升到下一个级别 - 在调用此代码的函数中处理它,而不是在那里.