猿问
下载APP

PHP:自定义错误处理程序 - 处理解析和致命错误

如何使用自定义错误处理程序处理解析致命错误?



冉冉说
浏览 58回答 3
3回答

缥缈止盈

简单回答:你做不到。参见手册:使用用户定义的函数无法处理以下错误类型:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,以及调用set_error_handler()的文件中引发的大部分E_STRICT。对于其他每个错误,您都可以使用 set_error_handler()编辑:既然看起来有关于这个主题的讨论,关于使用register_shutdown_function,我们应该看看处理的定义:对我来说,处理错误意味着捕获错误并以一种“好”的方式做出反应用户和底层数据(数据库,文件,Web服务等)。使用register_shutdown_function您无法处理调用它的代码中的错误,这意味着代码仍然会在发生错误时停止工作。但是,您可以向用户显示错误消息而不是白页,但是您不能回滚代码在失败之前执行的任何操作。

若吾皇

实际上你可以处理解析和致命错误。确实,用set_error_handler()定义的错误处理函数不会被调用。这样做的方法是使用register_shutdown_function()定义一个关闭函数。以下是我在我的网站上工作的内容:文件prepend.php(此文件将自动添加到所有php脚本)。有关将文件预先添加到PHP的提示,请参见下文。set_error_handler("errorHandler");register_shutdown_function("shutdownHandler");function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context){$error = "lvl: " . $error_level . " | msg:" . $error_message . " | file:" . $error_file . " | ln:" . $error_line;switch ($error_level) {    case E_ERROR:    case E_CORE_ERROR:    case E_COMPILE_ERROR:    case E_PARSE:        mylog($error, "fatal");        break;    case E_USER_ERROR:    case E_RECOVERABLE_ERROR:        mylog($error, "error");        break;    case E_WARNING:    case E_CORE_WARNING:    case E_COMPILE_WARNING:    case E_USER_WARNING:        mylog($error, "warn");        break;    case E_NOTICE:    case E_USER_NOTICE:        mylog($error, "info");        break;    case E_STRICT:        mylog($error, "debug");        break;    default:        mylog($error, "warn");}}function shutdownHandler() //will be called when php script ends.{$lasterror = error_get_last();switch ($lasterror['type']){    case E_ERROR:    case E_CORE_ERROR:    case E_COMPILE_ERROR:    case E_USER_ERROR:    case E_RECOVERABLE_ERROR:    case E_CORE_WARNING:    case E_COMPILE_WARNING:    case E_PARSE:        $error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];        mylog($error, "fatal");}}function mylog($error, $errlvl){...do whatever you want...}如果他在任何脚本中捕获错误,PHP将调用函数errorHandler()。如果错误强制脚本立即关闭,则错误由函数shutdownHandler()处理。这正在我正在开发的网站上工作。我还没有在生产中测试它。但它目前正在捕捉我在开发过程中发现的所有错误。我相信存在两次捕获相同错误的风险,每次执行一次。如果我在函数shutdownHandler()中处理的错误也被函数errorHandler()捕获,则可能发生这种情况。TODO的:1 - 我需要使用更好的log()函数来优雅地处理错误。因为我还在开发中,所以我基本上将错误记录到数据库并将其回显到屏幕上。2 - 为所有MySQL调用实现错误处理。3 - 为我的javascript代码实现错误处理。重要笔记:1 - 我在php.ini中使用以下行自动将上述脚本添加到所有php脚本中:auto_prepend_file = "/homepages/45/d301354504/htdocs/hmsee/cgi-bin/errorhandling.php"它运作良好。2 - 我正在记录并解决所有错误,包括E_STRICT错误。我相信开发一个干净的代码。在开发过程中,我的php.ini文件包含以下行:track_errors = 1display_errors = 1error_reporting = 2147483647html_errors = 0当我上线时,我会将display_errors更改为0,以降低用户看到丑陋的PHP错误消息的风险。我希望这可以帮助别人。

慕尼黑8549860

您可以使用以下代码跟踪这些错误:(如果它们出现在解析错误,只能抓到其他通过脚本文件include()或require(),或把这个代码放到一个auto_prepend_file其他的答案也提到。)function shutdown() {    $isError = false;    if ($error = error_get_last()){    switch($error['type']){        case E_ERROR:        case E_CORE_ERROR:        case E_COMPILE_ERROR:        case E_USER_ERROR:            $isError = true;            break;        }    }    if ($isError){        var_dump ($error);//do whatever you need with it    }}register_shutdown_function('shutdown');
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答