所以我对我的错误处理有点担心...目前我的执行路径看起来像这样:
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。
我可以在这里看到专业人士,但是当我的朋友的选择工作得很好时似乎有点不必要。
基本上我真的很困惑我应该如何处理这个...显然我的初始选择是不够的,但似乎创建我自己的异常可能会使事情变得太复杂。
那我该怎么办?
答案 0 :(得分:2)
在这里想想其他方面。如同,谁正在使用该API。无论谁调用该方法,他们可能都想知道 出了什么问题。例外情况提供了(返回值也可以),而您的初始方法则没有。
现在考虑消费者可能想要解决两个案例»没有用户发现«和»找到多个用户«。在那种情况下,他们运气不好,因为你为两者抛出相同的例外,并且无法区分这两种情况¹。在这种情况下,对于可能出错的不同事物具有不同的异常类型可能有所帮助。
但是仅如果你真的需要调用者的那个功能。如果您自己使用该方法,它不是公共API的一部分,您不知道如何使用它,并且区分这些情况是否有用,我会说不要打扰。
到目前为止,我很少使用自己的异常类型,并且主要是在编写解析器时,异常类型可以提示哪些内容确实出错,您可以使用异常的其他属性来生成有用的错误消息。在大多数其他代码中,我认为我从未这样做过。
¹你可以比较异常消息,但我建议永远不要这样做。该消息供用户或开发人员阅读。它可以被翻译成其他语言(例如,.NET的所有例外都是用你的UI语言编写的),这使得这种方法非常脆弱。