我目前参与开发一个大型Rails应用程序,通过自定义API gem与另一个产品进行接口交互。这导致了一种非常奇怪的错误处理方式。例如,当我们与其他产品进行交互时,它可能会返回身份验证错误,我们预料到这种情况。然后,我们在API gem中捕获该错误并抛出异常,该异常然后被捕获并在视图中传递给用户。
我不喜欢这种错误捕获方法,原因如下:
- 我们似乎不应该期望异常并在逻辑中使用它们。例如,有时我们想要覆盖对象 - 因此,我们捕获“对象已存在”的异常,然后继续保存我们的模型。 - 它需要很多特定的错误捕获。代码中有多个区域,我们需要使用if-else检查某些错误并相应地重定向。
话虽如此,我应该完善API gem,使其具有不抛出异常的简单功能吗?
更可取的是
此外,如果首选第一种方法,那么我们如何处理在这些函数中可能抛出的实际API错误?将它们冒泡到控制器中的rescue_from中吗?
在模型中捕获并处理异常是否更好,还是在模型中抛出异常并在控制器中处理它们?
我不喜欢这种错误捕获方法,原因如下:
- 我们似乎不应该期望异常并在逻辑中使用它们。例如,有时我们想要覆盖对象 - 因此,我们捕获“对象已存在”的异常,然后继续保存我们的模型。 - 它需要很多特定的错误捕获。代码中有多个区域,我们需要使用if-else检查某些错误并相应地重定向。
话虽如此,我应该完善API gem,使其具有不抛出异常的简单功能吗?
if user.has_permission_in_product?
if object.doesnt_exist_in_product?
do something
else
redirect somewhere with errors
end
else
redirect somewhere else with errors
end
更可取的是
begin
do something
rescue APIError => e
if e.message =~ "no permission"
redirect somewhere with errors
elsif e.message =~ "already exists"
redirect somewhere else with errors
end
end
此外,如果首选第一种方法,那么我们如何处理在这些函数中可能抛出的实际API错误?将它们冒泡到控制器中的rescue_from中吗?
在模型中捕获并处理异常是否更好,还是在模型中抛出异常并在控制器中处理它们?