gpt4 book ai didi

ruby-on-rails - 在哪里以及如何处理 Rails 异常?

转载 作者:数据小太阳 更新时间:2023-10-29 07:22:47 26 4
gpt4 key购买 nike

我目前参与开发一个大型 Rails 应用程序,该应用程序通过自定义 API gem 与另一个产品交互。这导致了一种非常奇怪的错误捕获。例如,当我们与其他产品交互时,它可能会返回我们预期的身份验证错误。然后我们在我们的 API gem 中捕获该错误并抛出一个异常,然后在 View 中捕获并转发给用户。

出于以下几个原因,我不喜欢这种错误捕获方法:

  • 我们似乎不应该期待异常并在我们的逻辑中使用它们。例如,有时我们想要覆盖一个对象——因此我们捕获“对象已存在”异常并继续保存我们的模型。
  • 它需要大量特定的错误捕获。在代码的多个区域,我们有 if-elses 检查某些错误并相应地重定向。

就是说,我是否应该充实 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 错误?我们是否将它们冒泡到 Controller 中的 rescue_from 中?

是在模型中捕获并处理异常,还是将它们扔到模型中并在 Controller 中处理它们更好?

最佳答案

你在找rescue_from吗?

在您的 Controller 中,执行以下操作:

class MyController < ApplicationController
rescue_from ActiveRecord::RecordNotFound, :with => :render_missing

def render_missing
render 'This is a 404', :status => 404
end
end

这将在每次引发 ActiveRecord::RecordNotFound 异常时执行 render_missing 方法。
您可以将它与您希望的任何异常类一起使用。而且您不再需要 Controller 中的任何开始/救援。

当然,模型中引发的任何异常也可以被 rescue_from 捕获。

关于ruby-on-rails - 在哪里以及如何处理 Rails 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com