关于c#:TRY-CATCH相对于USING


TRY-CATCH relative to USING

本问题已经有最佳答案,请猛点这里访问。

我一直在实现与使用相关的try-catch,如以下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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。所以我的示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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


这取决于你的目标。如果您想在catch块中对命令或连接执行某些操作,那么它应该在使用中。


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


我在using中使用的try-catch只在我想记录异常或它有事务时使用——将它回滚到except块中。使用由编译器在Try-Finally中翻译-您可以使用IL反汇编程序(ildasm.exe)或Reflector检查它,以释放您的一次性资源。以便using相当于:

1
2
3
4
5
6
7
8
try
{
 //do job
}
finally
{
  Resource.Dispose()
}

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


  • 不要捕获在这里无法处理的异常。
  • catch throw;除了增加复杂性之外没有任何用处。
  • 在异常源附近捕获并处理异常,因为您可以处理它们

阅读此处的广泛讨论