我知道如何在数据库调用的情况下使用 try/catch 块,并且知道如何在使用 try/finally 构造的上下文中使用“using”指令。
但是,我可以混合它们吗?我的意思是当我使用“使用”指令时,我是否也可以使用 try/catch 构造,因为我仍然需要处理可能的错误?
我知道如何在数据库调用的情况下使用 try/catch 块,并且知道如何在使用 try/finally 构造的上下文中使用“using”指令。
但是,我可以混合它们吗?我的意思是当我使用“使用”指令时,我是否也可以使用 try/catch 构造,因为我仍然需要处理可能的错误?
你绝对可以同时使用两者。
using
块基本上只是 try/finally 块的一点语法糖,如果你愿意,你可以嵌套 try/finally 块。
using (var foo = ...)
{
// ...
}
大致相当于这个:
var foo = ...;
try
{
// ...
}
finally
{
foo.Dispose();
}
当然你可以这样做:
using (var con = new SomeConnection()) {
try {
// do some stuff
}
catch (SomeException ex) {
// error handling
}
}
using
由编译器翻译成 a ,因此它与将 a 嵌套在 a中try..finally
没有太大区别。try..catch
try..finally
这是完全有效的:
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 中一样。
一个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
异常处理。