TRY-CATCH relative to USING
本问题已经有最佳答案,请猛点这里访问。
我一直在实现与使用相关的try-catch,如以下示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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。所以我的示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } } } |
这是更有效的布局吗?如果是,为什么?
附加说明
这取决于你的目标。如果您想在catch块中对命令或连接执行某些操作,那么它应该在使用中。
第二个更有效。对于第一个;您不能从catch块访问连接对象,也不能关闭它。另外,如果您正在通过此连接使用事务,则在发生任何错误时无法回滚该事务…
我在
1 2 3 4 5 6 7 8 | try { //do job } finally { Resource.Dispose() } |
如果只是抛出捕获的异常,则根本不需要try-catch块。使用将正确处理连接和命令。
- 不要捕获在这里无法处理的异常。
- catch throw;除了增加复杂性之外没有任何用处。
- 在异常源附近捕获并处理异常,因为您可以处理它们
阅读此处的广泛讨论