我有一个表单或页面以及分配给使用此页面的用户的一些权限(保存,修改,删除等),我们假设此用户只具有保存和修改权限。
当用户点击他没有特权的删除按钮时,我想向他显示一条消息,告诉他他没有这个特权,我的代码怎么样?
选项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
}
}
答案 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
语句来检查条件,没有理由不在这里使用。 (实际上,即使在第二个例子中,你也使用了一个。)它还会污染代码,导致许多不必要的事情分散了你正在做的事情的基本业务逻辑(检查权限设置) ),使代码更难以支持。
不要对逻辑流使用异常。使用它们来处理不应发生的意外事情,而不是确定预期会发生的事情的逻辑流程。