在Rails中的模块中定义自定义异常

时间:2009-07-07 13:02:54

标签: ruby-on-rails exception module

我创建了一个自定义模块(目前只定义了一个新的Exception类),并将其放在lib/lib_th.rb

module LibTH
    module Error
        IDNotFound = Class.new
    end
end

我不需要在我的代码中要求/包含模块,因为它应该自动加载,因为它遵循传统的命名规则。

但是当我尝试在我的代码中某处提出IDNotFound异常时:

res.size == 0 ? raise LibTH::Error::IDNotFound : res

我得到了以下错误:

SyntaxError (/Users/lrnz/code/ruby/corinna/app/models/treasure_hunt.rb:49: syntax error, unexpected tCONSTANT, expecting kDO or '{' or '('
  res.size == 0 ? raise LibTH::Error::IDNotFound : res
                             ^
/Users/lrnz/code/ruby/corinna/app/models/treasure_hunt.rb:49: syntax error, unexpected ':'
  res.size == 0 ? raise LibTH::Error::IDNotFound : res
                                                  ^):
app/controllers/treasure_hunts_controller.rb:50:in `show'

奇怪的是,我在script/console中尝试引发异常时没遇到任何问题:

>> raise LibTH::Error::IDNotFound
LibTH::Error::IDNotFound: LibTH::Error::IDNotFound
from (irb):70

谢谢!

2 个答案:

答案 0 :(得分:2)

没关系,我自己解决了这个问题:

而不是使用if ? then : else语句,我将其扩展为:

raise LibTH::Error::IDNotFound if res.size == 0
res

似乎你不能在类似C的if语句中使用常量值(作为类名),因此:

syntax error, unexpected tCONSTANT, expecting kDO or '{' or '('

谢谢你!

答案 1 :(得分:2)

常量不是问题,你只需要加注语法错误。如果您将其更改为:

res.size == 0 ? (raise LibTH::Error::IDNotFound) : res

它会起作用。不过,你纠正的形式更好。