我在Rails 6中工作。我在引发该错误的类中定义了一个错误类:
class MyClass < ApplicationRecord
...
class CustomError < StandardError
attr_reader :param
def initialize(param)
@param = param
end
end
end
我尝试在客户端代码中营救它,但这并不能捕获它:
rescue MyClass::CustomError => e
在另一方面,这引起了uninitialized constant
上CustomError
,完全按照我期望:
rescue CustomError => e
那这个呢?
rescue MyClass::CustomError => e
raise unless e.instance_of? MyClass::CustomError
# do some real error handling
...
end
instance_of?
无法识别错误,因此会重新引发。
我什至尝试过:
class MyClass < ApplicationRecord
...
end
class MyClass::CustomError < StandardError
attr_reader :para
def initialize(param)
@param = param
end
end
那就更好了
这2个东西都工作都是代码味道:
在包含类之外定义错误,没有命名空间
解决一般错误: rescue => e
在MiniTest中也可以正常工作:
e = assert_raises(MyClass::CustomError) do
...
end
感觉错误类名CustomError
根本无法MyClass::CustomError
在应用程序代码中解析,但客户端代码完全需要包含类名来解析该类。
虽然我只是在做些天真/愚蠢的事情,但更有可能!
附加信息:
MyClass
:MyChild < MyClass < ActiveRecord
(还不多见)对于任何不知道的人,Rails 4.2添加了Spring,以在终止应用程序时将其保留在内存中(以加快启动时间),Rails 5.2添加了Bootsnap,用于缓存优化的代码。它们中的任何一个都可以保留不变的代码,因为存在怪异的错误。
其中一个只是咬我。Bootsnap似乎在引发该错误,但并未使其在外部可见MyClass
。删除缓存将其全部清除:
rm -rf tmp/cache/bootsnap-compile-cache/
rm tmp/cache/bootsnap-load-path-cache
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句