关于使用/ try / catches的真正编码约定

时间:2011-10-30 09:20:36

标签: c# try-catch using

我们假设我得到了这段代码:

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}}

(对不起我的英文)

6 个答案:

答案 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是正确的做法。在生产中,如果您至少没有记录异常,您将如何诊断和修复错误?