首页 文章

自定义错误处理程序和尝试 - 捕获 - 如何干净地处理错误和警告

提问于
浏览
0

我想更好地理解异常处理 . 我有一个自定义错误处理程序 . 在没有邮件服务器的情况下运行以下函数时,它会正确地跳过错误处理程序并返回"Tough Luck" . 在错误处理程序中,我必须 throw new ErrorException() 才能激活 try/catch . 如果没有这个语句,在错误之后,程序将继续下一行代码(在这种情况下返回"Feedback left") .

能够继续使用下一行代码很有用,因为用户没有得到明显的错误消息和警告 . 但是,我希望能够在特定情况下使用Try / Catch .

什么是更好的方法来处理用户没有看到它们但我可以使用try / catch的错误?有没有办法抛出新的ErrorException(使用$ e-> getSeverity()?),如果存在try / catch,则会被处理,但如果没有,则忽略该异常?

set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);

echo feedback();

function feedback(){
    try{
        mail("m@localhost","subject","body","From: me");
        return "Feedback left.";
    }
    catch(Exception $e){
        error_log("Error sending feedback email." . "Some Custom Info For Error Log");
        return "Tough Luck";
    }
}


function exceptions_error_handler( $errno, $errmsg, $errfile, $errline, $context = null ){
    // custom log file handling
    log_exception( new ErrorException( $errmsg, 0, $errno, $errfile, $errline) );

    // required in order for the try/catch to be activated
    throw new ErrorException($errmsg, 0, $errno, $errfile, $errline);
}

1 回答

  • 1

    根据定义,如果未捕获异常(或其任何子类)将停止程序执行 . 您可能想要做的是 set_exception_handler() 能够处理代码中可能发生的任何未捕获的异常 .

    更一般地说,您需要决定处理异常和错误的策略 . 对于大多数人来说,当应用程序进入意外状态(例如没有邮件服务器,丢失数据库连接等)时会抛出异常 . 错误可能会导致您进入这种状态或在您处于这种状态时被触发,但不一定会导致您可能改变应用程序的行为方式(例如提前终止请求) .

    举个例子,对于你的情况,我可能会考虑这样的事情:

    try {
       echo feedback();
    } catch(Exception $e) {
       echo 'Feedback failed with exception: ' . $e->message;
    }
    
    function feedback() {
       $success = mail(...);
       if (false === $success) {
            $error_info = error_get_last();
            throw new Exception('Mail failed with error: ' . $error_info['message']);
       } else {
           return 'Feedback Left';
       }
    }
    

    通常,您可以围绕类方法调用的单个函数包装try-catch块,而不是尝试在函数本身内创建try-catch块 . 所以从本质上讲,你是在调用反馈函数,并且你正在捕获任何可能在执行此操作时引发的异常 .

    在编写良好的代码中,您可能会在大多数函数/方法代码块的开头附近看到 throw 以验证输入,因为具有无效输入将指示应用程序处于意外状态 . 所以类似于:

    public function set_foo($bar = NULL) {
        if(is_null($bar)) {
            throw new Exception('A value must be passed for $bar');
        }
    
        // perform method logic
    }
    

    通常的做法是从你抛出Expcetion的方法/函数中“提前退出” . 换句话说,在可能的情况下,检查所有依赖项并在代码块的开头抛出适当的Exception,然后再执行可能会执行更改应用程序状态等操作的逻辑 . 它还极大地帮助代码可读性将异常逻辑以这种方式组合在一起 .

相关问题