【发布时间】:2017-05-12 18:18:03
【问题描述】:
我在我们的代码库中发现了一个可能的问题,即开发人员忘记用花括号括住 using 语句的内容:
using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
try
{
RecordUserConnectionCore(context, userName);
transactionScope.Complete();
}
catch
{
transactionScope.Dispose();
throw;
}
try/catch 是否在 using 语句中执行? transactionScope 是否正确处置?
请注意,这个问题是关于 try/catch 块是否在 using 上下文中执行的。我问是因为 try/catch 代码周围没有大括号。
【问题讨论】:
-
您不需要在事务中使用 try-catch 来管理事务的完整性。
-
我的问题是关于花括号的使用,而不是关于使用 /idisposable 的工作原理
-
是否应该有大括号来清楚地传达打算成为 using 块的一部分的内容? IMO,是的,当然。在这种情况下,try/catch 是 using 块的一部分吗?是的。而 catch 中的
Dispose()调用是多余的。这意味着整个 try/catch 块完全没有意义,因为它所做的一切(除了不必要的 Dispose() 调用)就是重新抛出异常。 -
当没有大括号时,只有下一条语句将是代码块的主体。在这种情况下,主体是 TRY/CATCH。但在你的例子中,你真的不需要所有的开销。您正在使用 try/catch 来管理事务范围,然后只是重新抛出原始错误。您不妨删除 try catch 并将两个语句作为正文放在 USING 中。
标签: c# sql .net sql-server visual-studio