TRY-CATCH relative to USING
本文关键字:USING to relative TRY-CATCH | 更新日期: 2023-09-27 18:08:31
我一直在实现TRY-CATCH相对于USING,就像下面的例子:
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
。
这取决于你的目标。如果您想在catch块中使用命令或连接做一些事情,那么它应该在using中。
TRY-CATCH我只在using
中使用,如果我想记录异常,或者我有事务-在except块中回滚。using在TRY-FINALLY中由编译器翻译-您可以使用IL反汇编器(ildasm.exe)或反射器来检查它以释放您的一次性资源。如此......以至于......using
相当于:
try
{
//do job
}
finally
{
Resource.Dispose()
}
如果只是抛出捕获的异常,则根本不需要try-catch块。用户将正确处理约定和命令
第二个更有效率。第一个;不能从捕获块访问连接对象,也不能关闭它。此外,如果您在此连接上使用事务,则在发生任何错误时无法回滚事务…
- 不要捕捉你在这个地方无法处理的异常。
- catch{throw;}除了增加复杂性之外没有任何用处
- 尽可能在异常源附近捕获和处理异常
阅读这里的广泛讨论