【问题标题】:How can I create a custom exception in my Rails application?如何在我的 Rails 应用程序中创建自定义异常?
【发布时间】:2015-05-15 10:01:55
【问题描述】:

我正在尝试在 Rails 中创建自定义异常,但我设计的解决方案有问题。

这是我到目前为止所做的:

-在app/文件夹中创建一个名为errors/的文件夹,其中包含一个文件exceptions.rb

app/errors/exceptions.rb:

module Exceptions
    class AppError < StandardError; end
end
  • 在我的一个控制器中,试图抬起它:

引发异常::AppError.new("用户未被授权")

但是当我调用控制器的动作时,我得到的是:

NameError (uninitialized constant Exceptions::AppError

Did you mean? TypeError
              KeyError
              IOError
              EOFError


Did you mean? TypeError
              KeyError
              IOError
              EOFError
):

我想我还没有完全理解如何创建和使用新目录和文件。

我已经读到在app 目录中创建的所有内容都是急切加载的,所以我不明白问题出在哪里。

【问题讨论】:

  • 是否必须为异常创建 *.rb 文件?因为使用 *.yml 文件可以让您在访问自定义书面异常时获得更好的灵活性和更少的痛苦。
  • 我更喜欢使用和rb,但老实说我不知道​​你如何使用你建议的方法。有链接吗?
  • 在config/application.rb中加入这一行:require_relative 'app/errors/exceptions'
  • @Aetherus,似乎不起作用:NameError (uninitialized constant User::CustomersController::Exceptions
  • 语法通常是raise Exceptions::AppError, "message"

标签: ruby-on-rails ruby exception ruby-on-rails-4


【解决方案1】:

简短版:这是关于 rails 的自动代码加载 - 在这种情况下文件包含异常的事实并不重要(有关更多详细信息,请参阅主题上的 guide

Rails 会尝试从 exceptions/app_error.rb 加载它,在其自动加载路径上的任何文件中。因为您的文件命名与此不匹配,所以它找不到定义并且您得到一个 NameError。

如果您不关心代码重新加载(并且您可能不关心此类内容),那么您可以保持文件原样,但在初始化程序中需要它们(确保 app/errors 在加载路径中) :

require 'exceptions'

如果不是,那么您将不得不重新排列文件以匹配。如果您将 app/errors 添加到 rails 的自动加载路径并保持文件原样,那么它应该可以工作。如果您不想更改自动加载路径,则必须将其设置为自动加载路径中的某个位置,并确保模块的嵌套反映磁盘上的组织。

就我个人而言,我可能会将它们放在 lib 中并使用初始化程序要求它们

【讨论】:

  • 谢谢,但是我尝试在我的application.rb中添加你提到的那行,错误是一样的!
  • exceptions中重命名errors时也会发生同样的情况
  • config.autoload_paths += %W( #{Rails.root}/app/errors ) require 'errors/exceptions.rb'这个我加了,但是不行!
  • 自动加载路径和加载路径是分开的
  • 新代码 config.load_paths += %W( #{Rails.root}/app/exceptions ) require 'errors/exceptions.rb' 旧结果。 :(
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多