PHP*_*Pst 11 php rest error-handling single-page-application
在REST API中,200响应显示成功的操作.PHP默认情况下直接在响应正文中输出错误消息而不更改响应代码.在SPA中,响应文本不会直接对用户可见.因此,当应用程序无法按预期工作时,我通过FireBug检查响应主体,以检查可能的PHP异常(导致无效的json响应).有没有办法在所有PHP错误上发送特定的HTTP代码?
有没有办法根据任何PHP错误的存在更改HTTP响应代码?或者,是否可以抓取错误文本并以无忧无虑的方式以json格式发送.(在开发阶段)
更新:异常捕获(try/catch/final)不是我想要的.
jpi*_*tor 10
当然,您可以在PHP中更改HTTP状态:
<?php
header("HTTP/1.1 502 Bad Gateway");
?>
Run Code Online (Sandbox Code Playgroud)
您可以更改消息和代码,但必须小心标准代码
Dan*_*jel 10
举例来说,您只关心致命的运行时错误,致命的编译时错误和运行时警告.使用error_reporting()函数将错误报告设置为所需级别.
error_reporting( E_ERROR | E_COMPILE_ERROR | E_WARNING );
Run Code Online (Sandbox Code Playgroud)
由于用户定义的错误处理程序(稍后在下面)无法处理致命错误,因此仍会显示致命错误消息.为避免使用ini_set()函数并将其设置display_errors为零.
ini_set( 'display_errors', 0 );
Run Code Online (Sandbox Code Playgroud)
现在使用set_error_handler()创建一个自定义错误处理程序,以完全绕过指定错误类型的PHP错误处理程序(不适用于致命错误).
/* The following error types cannot be handled with a user defined function:
* E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING
* The standard PHP error handler is completely bypassed for the error types specified
* unless the callback function returns FALSE.
*/
function exception_error_handler( $severity, $message, $file, $line )
{
if ( !( error_reporting() & $severity ) ) {
// This error code is not included in error_reporting
return;
}
// code for handling errors
}
set_error_handler( "exception_error_handler" );
Run Code Online (Sandbox Code Playgroud)
使用register_shutdown_function()可以在关闭时处理致命错误.关闭处理程序在脚本完成后执行,或者终止(这也适用于错误).我们需要获取有关发生的最后一个错误的信息(error_get_last()),接下来是检查这是否是我们跟踪的错误类型(这里不需要它,因为未指定的错误error_reporting不会被触发,但过滤错误可能很有用),最后调用异常处理程序.
function fatal_error_shutdown()
{
$last_error = error_get_last();
if ( error_reporting() & $last_error['type'] )
call_user_func_array( 'exception_error_handler', $last_error );
}
register_shutdown_function( 'fatal_error_shutdown' );
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用自定义异常处理程序来捕获未处理的异常(包括致命异常)并强制响应代码(使用header()函数).
set_error_handler功能是我错过的.我想出了以下代码.欢迎任何更好的答案.
function jsonErrorHandler()
{
if (error_reporting()) {
http_response_code(500);
header('Content-Type: application/json; charset=utf-8');
$response = array_combine(['errno', 'errstr', 'errfile', 'errline', 'errcontext'], func_get_args());
die(json_encode($response));
}
}
set_error_handler('jsonErrorHandler');
Run Code Online (Sandbox Code Playgroud)
小智 5
使用框架或错误处理程序库.
根据您选择的框架,您可以自定义错误处理程序如何显示错误.我链接的错误处理程序显然支持默认情况下将错误序列化为JSON,您应该查看其文档.
有了框架,这是Laravel 4 的一个例子:
App::error(function(Exception $exception, $code) {
Log::error($exception);
return Response::json(["code" => $code, "message" => $exception->getMessage()], $code);
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您依赖全局错误处理程序,那么其他地方通常会出现问题 - 您不应该依赖它来处理错误; 而是在适当的地方使用try/catch.
虽然你的问题的一部分在这里得到了回答Returning http status codes with a rest api
我建议不要为许多警告、错误和通知发送不同的 http 代码。500(http 代码 500)内部服务器错误应该可以解决,并且您不需要向 API 使用者公开错误的细节。当然,您可以记录所有错误/通知/警告以调试和修复您的应用程序。
此外,还取决于您的应用程序逻辑,需要向用户报告哪些错误,例如数据验证、业务逻辑等。
| 归档时间: |
|
| 查看次数: |
3554 次 |
| 最近记录: |