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

标签 php error-handling try-catch

我试图更好地理解异常处理。我有一个自定义错误处理程序。在没有邮件服务器的情况下运行以下函数时,它会正确触发错误处理程序并返回“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);
}

最佳答案

根据定义,如果未捕获异常(或其任何子类),它们将停止程序执行。您可能想要做的是 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 block ,而不是尝试在函数本身内创建 try-catch block 。所以本质上你是try调用反馈函数,您将捕获在执行此操作时可能引发的任何异常。

在编写良好的代码中,您可能会看到 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 的方法/函数中“提前退出”通常是一种好习惯。换句话说,在可能的情况下,检查所有依赖项并在代码块的开头抛出适当的异常,然后再执行可能执行更改应用程序状态等操作的逻辑。以这种方式将异常逻辑预先分组也极大地有助于提高代码的可读性。

关于php - 自定义错误处理程序和尝试 - 捕获 - 如何干净地处理错误和警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20106763/

相关文章:

php - 输出数据到表中

php - Mysql带条件的子查询,不同的结果

php 为什么没有带有 jsonUnserialize 方法的\jsonUnserialized 接口(interface)?

oracle - 发生错误时如何退出sqlplus

python - django 中的自定义表单更新

java - 如何为 Java RESTful Web 服务发送 HTTP 错误?

python - "KeyError"和 "KeyError as e"之间有什么区别?

php - 获取没有文件的文件夹

java - 使用 try 和 catch 检查条件 block-java

r - 错误: Results are not data frames at positions: