我们假设我得到了这段代码:
internal static bool WriteTransaction(string command)
{
using (SqlConnection conn = new SqlConnection(SqlConnectionString))
{
try
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(command, conn))
cmd.ExecuteNonQuery();
}
catch { return false; }
}
return true;
}
好吧,我已将conn的using
置于try
/ catch
子句之外,因为SqlConnection
的构造函数不会抛出任何异常(如上所述)。因此,conn.Open()
在子句中,因为它可能会抛出一些例外。
现在,这是正确的编码方法吗?看看:SqlCommand
的构造函数也不会抛出exceptinos,但为了减少代码,我将cmd.ExecuteNonQuery()
和try
放在catch
/ internal static bool WriteTransaction(string command)
{
using (SqlConnection conn = new SqlConnection(SqlConnectionString))
{
try { conn.Open(); }
catch { return false; }
using (SqlCommand cmd = new SqlCommand(command, conn))
try { cmd.ExecuteNonQuery(); }
catch { return false; }
}
return true;
}
内。
或者,
也许这个应该在那里?
{{1}}
(对不起我的英文)
答案 0 :(得分:1)
除非你能以某种有意义的方式处理异常,否则不要抓住它。相反,让它传播调用堆栈。
例如,SqlCommand
ExecuteNonQuery()
在什么条件下可以抛出异常?一些可能性是sql查询不正确地形成,无法执行或者您丢失了与数据库服务器的连接。你不想以同样的方式处理这些,对吗?
您应该考虑处理的一个例外是SQLException
死锁(错误编号 1205 )。
正如评论中指出的那样,您至少应该记录例外情况。
[顺便说一下,WriteTransaction()
可能是该方法的一个不好的名字,考虑到你所展示的代码。]
答案 1 :(得分:1)
你的第一个代码示例,只有一个try-catch块,相当于第二个。但是,第一个更容易阅读和更短。
值得注意的是,通常的C#编码方法不会捕获异常,除非在代码的最顶层。
这里有一个写得很好的参考文献:http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx。
在你的情况下,这将简化你的代码:而不是返回一个bool来指示方法成功或失败,然后对此进行测试,通过使方法无效并仅仅处理意外异常来“假设为最佳”顶级异常处理程序。
写入数据库的异常处理可以被视为这个一般规则的一个小例外:但我个人的方法是专门针对并发问题进行陷阱,如果发生这种情况,请重试几次。
答案 2 :(得分:0)
有良好catch
子句(异常日志记录)你不需要2x try
块,1就够了
...
你的第二种方法是错误的 - 没有需要try catch
打开连接 - 因为即使你抓住了这个你仍然完成 - 你不能执行查询。在你的catch块中,你可以尝试“修复”这个问题,但它会给你什么 - 在catch
中的循环?
答案 3 :(得分:0)
我认为您的第一个解决方案更好,因为如果您遇到错误,建立连接对尝试在该连接上执行命令没有用。
所以在第一个解决方案中如果出现错误,你可以直接执行catch
阻止然后处理对象,而第二个则通过两个例外,重载内存无用。
答案 4 :(得分:0)
你的第一种方法是更好的方法,原因很简单:方法的两个版本在行为方面是相同的,但第一种方法需要更少的代码。
有时它就像计算代码行一样简单; - )......
HTH!
P.S。
我根本不会在这个方法中有try/catch
语句,但我会将它放在更高级别,调用此内部方法。
答案 5 :(得分:0)
鉴于你的方法'WriteTransaction'正在吞噬所有异常并返回事务的成功与否,那么我会在整个方法中使用一个try / catch块。
internal static bool WriteTransaction(string command) {
try {
using (SqlConnection conn = new SqlConnection(SqlConnectionString)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand(command, conn)) {
cmd.ExecuteNonQuery();
}
}
}
catch {
return false;
}
return true;
}
现在您应该问问自己,捕获所有异常并返回true / false是正确的做法。在生产中,如果您至少没有记录异常,您将如何诊断和修复错误?