我在这里看到两个问题,这是我的看法...
数据库约束好吗?对于大型系统,它们是不可或缺的。大多数大型系统都有不止一个前端,而且并不总是使用可以共享中间层或 UI 数据检查逻辑的兼容语言。它们也可能仅在 Transact-SQL 或 PL/SQL 中具有批处理。可以在前端重复检查,但在多用户应用程序中,真正检查唯一性的唯一方法是插入记录并查看数据库的内容。与外键约束相同 - 在您尝试插入/更新/删除之前您不会真正知道。
应该允许抛出异常,还是应该替换返回值?这是问题的代码:
try
{
// inset data
}
catch (SqlException ex)
{
if (ex.Message.ToLower().Contains("duplicate key"))
{
if (ex.Message.ToLower().Contains("url"))
{
return 1; // Sure, that's one good way to do it
}
if (ex.Message.ToLower().Contains("email"))
{
return 2; // Sure, that's one good way to do it
}
}
return 3; // EVIL! Or at least quasi-evil :)
}
如果您可以保证调用程序实际上会根据返回值进行操作,我认为return 1
和return 2
最好留给您自己判断。我更喜欢为这样的情况(例如DuplicateEmailException
)重新抛出自定义异常,但这只是我 - 返回值也可以解决问题。毕竟,消费者类可以像忽略返回值一样容易地忽略异常。
我反对return 3
. 这意味着发生了意外的异常(数据库关闭、连接错误等)。在这里,您有一个未指定的错误,您拥有的唯一诊断信息是:“3”。想象一下在 SO 上发布一个问题,说我试图插入一行,但系统说“3”。请指教。它将在几秒钟内关闭:)
如果您不知道如何处理数据类中的异常,那么数据类的使用者就无法处理它。在这一点上,你已经非常紧张了,所以我说记录错误,然后尽可能优雅地退出,并显示“意外错误”消息。
我知道我对意外异常有些抱怨,但我处理了太多支持事件,程序员只是对数据库异常进行后续处理,当出现意外情况时,应用程序要么静默失败,要么下游失败,留下零诊断信息。很调皮。