TRY-CATCH相对于USING

时间:2013-04-11 09:09:07

标签: c#

我已经实现了相对于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 EXAMPLE似乎指向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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

TRY-CATCH我在using中只在我想要LOG异常或者我有事务时才使用它来在除了块之外回滚它。 使用由编译器在TRY-FINALLY中翻译 - 您可以使用IL反汇编程序(ildasm.exe)或反射器检查它以释放您的可支配资源。 以便 using相当于:

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

  • 不要抓住你在这个地方无法处理的例外情况。
  • 除了添加复杂性之外,
  • catch {throw;}没有用处
  • 捕获并处理异常源附近的异常,因为您可以处理它们

Read extensive discussion here