如何从另一个Laravel应用程序中捕获Laravel错误?

时间:2017-04-19 16:27:35

标签: php laravel curl error-handling

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

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

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

申请申请:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="selector">
  <option>a</option>
  <option>b</option>
  <option>c</option>
  <option>d</option>
</select>

<div id="a">A</div>
<div id="b">B</div>
<div id="c">C</div>
<div id="d">D</div>

我收到的申请表:

$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; } 调用的结果是整个HTML,错误代码深深嵌入。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您无法捕获异常,但可以为返回的不同状态代码添加不同的逻辑,在本例中为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);
}

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