我已经实现了相对于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
。
答案 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)