【问题标题】:How can I catch a Laravel error from another Laravel application?如何从另一个 Laravel 应用程序中捕获 Laravel 错误?
【发布时间】:2017-04-19 16:27:35
【问题描述】:

我有两个 Laravel 应用程序,一个正在从另一个调用 API。

如果请求应用程序发送无效数据,API 会调用 Laravel 的“中止”函数。

但是,我似乎无法在请求应用程序端发现此错误。这是一些代码:

请求申请:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

if ($method == 'POST') {
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));    
}

$result = curl_exec($ch);

Log::info($result);

curl_close($ch);

还有我的接收申请:

if ($result == '') {
    $error = 'An unexpected error occurred fetching shipping rates. If this error persists, please contact support.';
    abort(400, $error, array('errorText'=>$error));
    $error = true;
}

现在,我无法特别修改接收应用程序的错误处理,因为该应用程序已经正确处理了这些错误消息。

但在我的请求应用程序中,Log::info 调用的结果是整个 HTML 以及深度嵌入的错误代码。

如果没有一些自定义字符串解析,我似乎无法获得该消息,但我觉得应该有一些方法知道它失败并检索该错误消息。

有什么想法吗?

【问题讨论】:

    标签: php laravel curl error-handling


    【解决方案1】:

    您无法捕获异常,但您可以为返回的不同状态码添加不同的逻辑,在本例中为 400。

    $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($statusCode == 400) {
        // Do things
    }
    

    如何以更通用的方式处理此问题实际上取决于您以及您希望 API 的行为方式。例如,如果您想向您的 API 添加授权并且有人传递了无效的凭据,您可能想要abort(401),这意味着未经授权。您可以在此处查看状态代码列表及其含义...https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

    不过,如果您是唯一使用此服务的人,那么您需要多深入地了解此服务真的取决于您。不过一般情况下,200 范围内的任何内容都意味着它成功,因此您可能只需要检查状态代码是否为 200,否则您可以假设存在错误。

    关于如何从 HTML 中获取错误消息,确实没有一个好的方法可以做到这一点,而且你真的不应该这样做。更好的解决方案是更改您的 API,使其不返回所有 HTML,而是返回更容易解析的响应。例如,如果您的 API 返回 JSON,您可能希望在出现错误时返回 JSON 响应,其中包含错误消息、状态代码以及您可能认为有用的任何其他信息。为此,您需要更改 app/Exceptions/Handler.php,以便它知道它需要返回 JSON 响应,而不是出错时返回 HTML。

    您可能还会发现修改错误响应的文档很有帮助,可以在这里找到...https://laravel.com/docs/5.4/errors#the-exception-handler

    具体来说,您似乎需要更改 render 方法。在将其作为 JSON 返回的情况下,它可能需要看起来像这样......

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return response()->json([
            'message' => $exception->getMessage(),
            'code' => $exception->getCode(),
        ]);
    
        // return parent::render($request, $exception);
    }
    

    这将只返回错误消息和状态代码。

    【讨论】:

    • 嗯,我刚试过这个并记录了返回的 statusCode,由于某种原因,它是 0,而不是 400。
    • 奇怪,你在使用curl_close之前是不是这样?
    • 是的,但它也在 curl_exec 之前。傻我。除了将其与 400 进行比较之外,现在有没有一种通用的方法来确定它是否是一个错误?
    • 另外,如何在不显式解析大量字符串的情况下获取错误文本消息?
    • 我已经更新了答案,希望能回答你的问题。
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2018-02-17
    相关资源
    最近更新 更多