0

我知道如何在数据库调用的情况下使用 try/catch 块,并且知道如何在使用 try/finally 构造的上下文中使用“using”指令。

但是,我可以混合它们吗?我的意思是当我使用“使用”指令时,我是否也可以使用 try/catch 构造,因为我仍然需要处理可能的错误?

4

4 回答 4

2

你绝对可以同时使用两者。

using块基本上只是 try/finally 块的一点语法糖,如果你愿意,你可以嵌套 try/finally 块。

using (var foo = ...)
{
     // ...
}

大致相当于这个:

var foo = ...;
try
{
    // ...
}
finally
{
    foo.Dispose();
}
于 2012-10-26T07:26:19.393 回答
1

当然你可以这样做:

using (var con = new SomeConnection()) {
    try {
        // do some stuff
    }
    catch (SomeException ex) {
        // error handling
    }
}

using由编译器翻译成 a ,因此它与将 a 嵌套在 a中try..finally没有太大区别。try..catchtry..finally

于 2012-10-26T07:26:13.997 回答
0

这是完全有效的:

using (var stream = new MemoryStream())
{
    try
    {
        // Do something with the memory stream
    }
    catch(Exception ex)
    {
        // Do something to handle the exception
    }
}

编译器会将其翻译成

var stream = new MemoryStream();
try
{
    try
    {
        // Do something with the memory stream
    }
    catch(Exception ex)
    {
        // Do something to handle the exception
    }
}
finally
{
    if (stream != null)
    {
        stream.Dispose();
    }
}

当然,这种嵌套也可以反过来工作(就像将using-block嵌套在try...catch-block 中一样。

于 2012-10-26T07:28:24.090 回答
0

一个using如:

using (var connection = new SqlConnection())
{
    connection.Open
    // do some stuff with the connection
}

只是编写如下代码的语法快捷方式。

SqlConnection connection = null;
try
{
   connection = new SqlConnection();
   connection.Open
   // do some stuff with the connection
}
finally
{
   if (connection != null)
   {
      connection.Dispose()
   }
}

这意味着,是的,您可以将它与其他 try..catch 或其他任何内容混合使用。这就像将 a 嵌套try..catch在 a 中一样try..finally。它只是作为一种快捷方式来确保您“使用”的项目在超出范围时被处理掉。它对您在范围内所做的事情没有真正的限制,包括提供您自己的try..catch异常处理。

于 2012-10-26T07:31:56.003 回答