TRY-CATCH relative to USING

本文关键字:USING to relative TRY-CATCH | 更新日期: 2023-09-27 18:08:31

我一直在实现TRY-CATCH相对于USING,就像下面的例子:

private void someDatabaseMethod(string userName) {
    try {
        using(var conn = new SqlConnection(connString))
        using(var comm = new SqlCommand()) {
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            comm.CommandText = string.Concat(@"SELECT UserID FROM xxx WHERE UserName = '", userName,@"'");
            conn.Open();
            object x = comm.ExecuteScalar();
            UserID = (x==null)? 0: (int)x;
        }
    } catch(Exception) {
        throw;
    }
}

我刚刚看到这个MSDN示例,它似乎指向TRY-CATCH在USING中。所以我的例子看起来像这样:

private void someDatabaseMethod(string userName) {
        using(var conn = new SqlConnection(connString))
        using(var comm = new SqlCommand()) {
            comm.Connection = conn;
            comm.CommandType = CommandType.Text;
            comm.CommandText = string.Concat(@"SELECT UserID FROM xxx WHERE UserName = '", userName,@"'");
            try {
               conn.Open();
               object x = comm.ExecuteScalar();
               UserID = (x==null)? 0: (int)x;
            } catch(Exception) {
               throw;
            }
        }
}

这是一个更有效的布局吗?如果是,为什么?


额外注释

TRY-CATCH的原因是重新抛出异常,以便我将其气泡到下一个级别-所以我想在代码中的某个地方有一个CATCH

TRY-CATCH relative to USING

这取决于你的目标。如果您想在catch块中使用命令或连接做一些事情,那么它应该在using中。

TRY-CATCH我只在using中使用,如果我想记录异常,或者我有事务-在except块中回滚。using在TRY-FINALLY中由编译器翻译-您可以使用IL反汇编器(ildasm.exe)或反射器来检查它以释放您的一次性资源。如此......以至于......using相当于:

try 
{
 //do job
} 
finally
{
  Resource.Dispose()
}

如果只是抛出捕获的异常,则根本不需要try-catch块。用户将正确处理约定和命令

第二个更有效率。第一个;不能从捕获块访问连接对象,也不能关闭它。此外,如果您在此连接上使用事务,则在发生任何错误时无法回滚事务…

  • 不要捕捉你在这个地方无法处理的异常。
  • catch{throw;}除了增加复杂性之外没有任何用处
  • 尽可能在异常源附近捕获和处理异常

阅读这里的广泛讨论