3

我一直在实施相对于 USING 的 TRY-CATCH,如下例所示:

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在代码中的某个地方。

4

5 回答 5

3

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

于 2013-04-11T09:10:56.660 回答
2

如果您只是抛出捕获的异常,则根本不需要 try-catch 块。使用将正确配置连接和命令。

于 2013-04-11T09:11:11.033 回答
2

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

try 
{
 //do job
} 
finally
{
  Resource.Dispose()
}
于 2013-04-11T09:16:37.360 回答
2

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

于 2013-04-11T09:20:33.873 回答
0
  • 不要捕获在这个地方无法处理的异常。
  • catch{throw;} 除了增加复杂性之外没有任何用处
  • 尽可能在异常源附近捕获和处理异常

在这里阅读广泛的讨论

于 2013-04-11T09:18:15.893 回答