何时使用Exception

时间:2013-12-31 13:40:09

标签: exception-handling

我有一个表单或页面以及分配给使用此页面的用户的一些权限(保存,修改,删除等),我们假设此用户只具有保存和修改权限。

当用户点击他没有特权的删除按钮时,我想向他显示一条消息,告诉他他没有这个特权,我的代码怎么样?

选项1

If(loggedUser.Privileges.Contains(PrivilegeTypes.Delete) == false)
{
     MessageBox.Show("You dont have delete privilege!");
     // Log that user tried to delete without permission etc
     return;
}

选项2

try
{
     If(loggedUser.Privileges.Contains(PrivilegeTypes.Delete) == false)
     {
         // Throw custom exception
         throw new UngrantedPrivilegeException(PrivilegeTypes.Delete, "Invalid privilege exception");
     }
}
catch (UngrantedPrivilegeException ex)
{
     if( ex.PrivilegeType == PrivilegeTypes.Delete) 
     {
          MessageBox.Show("You dont have delete privilege!");
          // Log that user tried to delete without permission etc
     }
}

2 个答案:

答案 0 :(得分:3)

在这种情况下,我会选择第一个选项,因为我知道有什么可能性,并且不需要创建不需要的异常对象作为内存负担。

异常应该用于处理未知的运行时错误,而不是逻辑条件。

答案 1 :(得分:1)

在这种情况下绝对没有理由使用例外。关于代码正在做什么,没有什么例外,简单的条件逻辑是合适的。

考虑第一个选项的语义逻辑:

Does the user have permission?
    Tell the user they don't have permission.

现在考虑第二个选项的语义逻辑:

Try to check for permission
    Does the user have permission?
        The user does not have permission.
Did the user have permission?
    Tell the user they don't have permission.

在第二个看起来像很多冗余,你不觉得吗?您还通过为 处理它的唯一目的添加一个例外来为运行时添加更多开销,当你真正想做的就是检查一个条件时。存在if语句来检查条件,没有理由不在这里使用。 (实际上,即使在第二个例子中,你使用了一个。)它还会污染代码,导致许多不必要的事情分散了你正在做的事情的基本业务逻辑(检查权限设置) ),使代码更难以支持。

不要对逻辑流使用异常。使用它们来处理不应发生的意外事情,而不是确定预期会发生的事情的逻辑流程。