【问题标题】:PHP: Exceptions vs Custom ErrorsPHP:异常与自定义错误
【发布时间】:2011-05-08 22:58:04
【问题描述】:

今天我和我的一个朋友进行了愉快的交谈。我们涵盖了 Web 开发的几个方面。

他批评了我的应用程序错误处理方法,基本上如果我需要检查用户权限来执行某个操作,我会执行以下操作:

// My little function
function check_user_perms($user)
{
    // @returns boolean
    // checking is user is permitted to perform an action
    return ($something > 1) ? TRUE : FALSE; // of course it returns true/false, not null
}

// place where I need to check user permission
// please note that following lame snippets are meant to show you my approach
if( check_user_perms($user_id) )
{
    // perform the action
}
else
{
    echo 'You have no permission to perform this action.';
}

他说,我应该使用异常。所以我开始阅读并认为我学到了很好的例外做法。

只有几件事需要澄清:
1. 我应该对 Web 应用程序中的所有内容都使用异常吗?
2. 如果是这样,如何在生产中向用户显示消息?
3. 你会建议什么方法?

【问题讨论】:

  • 这段代码(特别是回显)是否驻留在您的输出模板中? - 例外当然不适用于“一切”。将它们用于最终用户消息信号是可行的(特殊异常类),但理想情况下,用户通知应该使用由应用程序处理的单独系统,而不是由运行时处理。

标签: php exception exception-handling


【解决方案1】:

异常应该用于“异常情况”。检查用户是否具有适当的权限不是“例外情况”。这是一个非常常见的检查,不应使用异常。在这里返回true/false 很好。

另一方面,如果在检查用户是否可以访问时发生“异常”错误,例如由于身份验证服务器关闭而无法检查,那么抛出异常是合适的。

这里有更多资源可供查看:

【讨论】:

    【解决方案2】:

    check_user_perms 绝对应该返回TRUEFALSE(而不是NULL!)。

    例外是针对特殊情况,而不是一般的程序流程控制。

    一个例子可能是:

    • 如果用户有权限执行此操作,返回TRUE
    • 如果用户无权执行此操作,返回FALSE
    • 如果用户不存在,则抛出异常(因为如果一开始调用此函数,我们就希望用户存在)。

    【讨论】:

      【解决方案3】:

      您应该将异常用于异常情况,即意外或不寻常的情况。根据检查的上下文,缺少权限可能是异常的,也可能不是。例如,如果您的代码只是为授权用户做一件事,而为未经授权的用户做另一件事,或者更常见的是允许对授权用户进行额外访问(例如,为管理员显示管理菜单),那么您不应该使用例外这个。另一方面,如果未经授权的用户尝试访问需要授权的 Web 操作,或者非管理员尝试访问仅限管理员的操作,则异常可能是适当的响应。在这种情况下,您应该捕获异常并执行适当的操作,例如重定向到登录或错误操作。

      作为概括,我想说确定用户是否具有特定权限的代码不应该抛出异常,而是返回 true 或 false。调用该调用的代码可能会根据上下文选择在需要和预期权限时抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 2019-07-11
        相关资源
        最近更新 更多