什么是处理代码错误的最佳方法?

时间:2014-05-08 13:48:37

标签: c# exception-handling

所以我对我的错误处理有点担心...目前我的执行路径看起来像这样:

  

Users.aspx - > App_Code / User.cs - >数据层/ User.cs

所以现在当我尝试更新用户记录时,我将Try / Catch块放在事件处理程序中,并确保只有App_Code类与数据层交互。根据我的理解,数据层上发生的异常应该冒泡到下面的事件处理程序。

在数据层,我从这开始:

public void Update()
{
    var product = (from p in db.products
                        where p.productid == id
                        select p).FirstOrDefault();

    if (product != null)
    {
        // update the thing
    }
}

更多信息on reddit

与朋友聊天后,他推荐了这样的话:

public void Update()
{
    int count = db.users.Count(u => u.userid == id);

    if (count == 0) // no user found
    {
        throw new ValidationException(String.Format("User not found for id {0}.", id));
    }
    if (count > 1) // multiple users
    {
        throw new ValidationException(String.Format("Multiple users found for id {0}.", id));
    }

    var user = db.users.FirstOrDefault(u => u.userid == id);
    // update the user record
}

然后我去了IRC,他们建议我create my own Exceptions

我可以在这里看到专业人士,但是当我的朋友的选择工作得很好时似乎有点不必要。

基本上我真的很困惑我应该如何处理这个...显然我的初始选择是不够的,但似乎创建我自己的异常可能会使事情变得太复杂。

那我该怎么办?

1 个答案:

答案 0 :(得分:2)

在这里想想其他方面。如同,谁正在使用该API。无论谁调用该方法,他们可能都想知道 出了什么问题。例外情况提供了(返回值也可以),而您的初始方法则没有。

现在考虑消费者可能想要解决两个案例»没有用户发现«和»找到多个用户«。在那种情况下,他们运气不好,因为你为两者抛出相同的例外,并且无法区分这两种情况¹。在这种情况下,对于可能出错的不同事物具有不同的异常类型可能有所帮助。

但是如果你真的需要调用者的那个功能。如果您自己使用该方法,它不是公共API的一部分,您不知道如何使用它,并且区分这些情况是否有用,我会说不要打扰。

到目前为止,我很少使用自己的异常类型,并且主要是在编写解析器时,异常类型可以提示哪些内容确实出错,您可以使用异常的其他属性来生成有用的错误消息。在大多数其他代码中,我认为我从未这样做过。


¹你可以比较异常消息,但我建议永远不要这样做。该消息供用户或开发人员阅读。它可以被翻译成其他语言(例如,.NET的所有例外都是用你的UI语言编写的),这使得这种方法非常脆弱。