php中的异常真的有用吗?

Mah*_*ver 10 php oop exception-handling

3天前,在阅读了很多关于使用OOP的优点之后,我开始使用类作为练习在OOP中重写我的一个脚本.

现在我很困惑天气我应该使用例外与否.他们似乎让我的工作更努力,更长久.

我的应用程序检查数据是否是通过Ajax请求发送的,然后通过脚本使用该信息.

检查此示例:

 /*
 * The older way
 */

if($ajaxEnabled) {
    $error = errorWrap('Ajax error');
} else {
    $error = errorWithBackLinkWrap('NoAjax error');
}

function doSomething() {
    if(empty($POST['name'])) {
            die($error);
    }
}

/* 
 * OOP way
 */

class someClass {
    private $_ajaxEnabled;

    public function doSomething() {
        try {
            if(!$this->_isDateValid()) {
                if($this->$_ajaxEnabled) {
                    throw new ajaxException('Ajax error');
                } else {
                    throw new noAjaxException('NOAjaxError');
                }
            }
        } catch(ajaxException $e) {
            echo $e->getErrorMessage();
        } catch(noAjaxException $e) {
            echo $e->getErrorMessage();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码仅用于演示问题,因此我知道其中有一些未定义的函数:).

所以在开始之前,错误处理对我来说更容易,因为我只需要回应相应的错误.

现在使用异常,在每个函数中我必须首先检查连接类型,然后为每个抛出的异常编写2个catch函数,这会导致更大的代码.

我在php中对OOP真的很新,所以也许有一个更清洁,更好的方法来做到这一点,是吗?

kiz*_*zx2 8

你的问题并不少见,是否/何时使用例外有时是一个哲学决定,许多有经验的开发人员无法围绕它.

话虽这么说,我发现列出每种处理错误方式的不同属性可以很容易地选择你喜欢的方式:

返回代码

  • 呼叫者可以忽略它或忘记检查它
  • 调用者在使用之前通常需要更多的文档阅读(是否0意味着成功或失败?)
  • 不保证对象破坏 - 这一切都取决于调用者是否正确清理

何时使用:这很明显.当您信任调用者时使用返回代码(内部代码或可以安全忽略的普通错误).

例外

  • 来电者不能忽视它
  • 如果他想要,呼叫者仍然可以抑制它(空的try/catch)
  • 对象破坏适当地发生 - 大多数时候

何时使用:如果您不信任您的呼叫者(第三方),或者您确实需要确保您的错误代码不会被忽略.

  • 不容忽视,无法抑制

何时使用:通常很明显.你需要立即停止一切.

(在PHP环境中,我认为它没有多大区别.上述建议仍应适用.)


(在旁边)

通常情况下,当发生错误时(例如,当您学习的第一种编程语言是PHP:P时)写出错误消息是很诱人的.但是如果你真的想要理解OOP,那么它不是处理错误的正确方法.

理想情况下,每个对象或每个函数只应执行一个函数.如果一个函数将错误屏幕做自己的事,很难在以后切换到DatabaseErrorLoggerTextFileErrorLogger或等等.一个办法是提供一个记录器使用(这叫做依赖注入).另一种方法是使用异常 - 这样,调用者可以选择ErrorLogger使用哪个.


Pau*_*sik 5

异常作为一种错误处理机制在概念和实现上与函数返回码有很大不同。您不能/不应该简单地将一个映射到另一个。在继续下一步之前,您应该阅读并消化这篇文章(然后还有一些,包括这篇*)。

如果您打算使用异常而不是返回代码来报告/处理错误,那么您的代码结构应该发生重大变化。

(*CodeProject 链接是特定于 .NET 的,但几乎没有代码摘要。它主要是一篇易于适用于任何语言的最佳实践文章。)