【发布时间】:2010-06-30 15:47:30
【问题描述】:
我目前参与开发一个大型 Rails 应用程序,该应用程序通过自定义 API gem 与另一个产品交互。这导致了一种非常奇怪的错误捕获。例如,当我们与其他产品交互时,它可能会返回我们预期的身份验证错误。然后,我们在 API gem 中捕获该错误并引发异常,然后将其捕获并转发给视图中的用户。
我不喜欢这种错误捕获方法,原因如下:
- 似乎我们不应该期待异常并在我们的逻辑中使用它们。例如,有时我们想要覆盖一个对象——因此我们捕获“对象已存在”异常并继续保存我们的模型。
- 它需要很多特定的错误捕获。在代码中有多个区域,我们使用 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 中?
是在模型中捕获并处理异常,还是在模型中抛出并在控制器中处理?
【问题讨论】:
标签: ruby-on-rails ruby exception-handling