如何在REST api中处理php通知,警告和错误?

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)

您可以更改消息和代码,但必须小心标准代码

  • 答案没有解决这个问题,我想知道它是如何获得这样的选票的. (3认同)

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()函数).


PHP*_*Pst 6

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.


Nom*_*man 4

虽然你的问题的一部分在这里得到了回答Returning http status codes with a rest api

我建议不要为许多警告、错误和通知发送不同的 http 代码。500(http 代码 500)内部服务器错误应该可以解决,并且您不需要向 API 使用者公开错误的细节。当然,您可以记录所有错误/通知/警告以调试和修复您的应用程序。

此外,还取决于您的应用程序逻辑,需要向用户报告哪些错误,例如数据验证、业务逻辑等。


归档时间:

查看次数:

3554 次

最近记录:

9 年,5 月 前