在API调用上尝试{} catch {}或以不同方式处理?

时间:2016-05-20 11:58:49

标签: php laravel error-handling laravel-5 laravel-5.2

在Laravel 5.2应用程序中,我试图找出处理异常的最优雅方法,当外部服务的API调用抛出异常时。这些不应该阻止程序继续进行,因为即使没有有问题的API调用,也可以在之后运行应用程序的其他部分。

E.g。目前我有

try {
    $statistics->results = $api->call($parameter);
    $statistics->status = Statistic::SUCCESS;
} catch (ExternalApiCallException $e) {
    $statistics->results = null;
    $statistics->status = Statistic::API_CALL_ERROR;
}

我正在考虑使用Laravel的app/Exceptions/Handler.php并使用

if ($e instanceof ExternalApiCallException $e) {
    Log::warning("API Call didn't work");
}

但后来我无法在那里设置统计信息的状态,因为Handler.php无法访问它。有没有更好的方法或尝试捕获阻止的方式去这里?

1 个答案:

答案 0 :(得分:1)

try-catch-finally绝对是一个很好的方法。在你的情况下,API异常是本地化的,不应该全局出现(我推测),所以我会选择将逻辑保存在一个地方,而不是将异常处理作为Handler.php文件中的条件。在我看来,Handler.php应该被用作最后的选择,用于设置和报告其他未捕获和意外的异常。对于异常不重要甚至没有预期的所有其他情况,本地try {}块更容易维护,因为代码的重要部分不会被开发人员隐藏在另一个文件中。

不要忘记你也可以使用finally {}块,无论是否触发了异常,都会在try {}和catch {}块之后执行。

try
{
    // run this first
}
catch (ExternalApiCallException $e)
{
    // in case something went wrong
}
finally
{
    // this runs after everything else
}