我对 ruby 比较陌生,我遇到了这个问题
,这个问题很难解决。我想要实现的是我可以捕获从父类中的子类抛出的自定义错误。下面举个例子,如何让父类理解RequestTimeout
类?因为,现在当我运行代码时,它会产生以下输出:
test_raise.rb:5:in `rescue in handle_errors': uninitialized constant BaseService::RequestTimeout (NameError)
from test_raise.rb:4:in `handle_errors'
from test_raise.rb:14:in `first_service_method'
from test_raise.rb:31:in `<main>'
代码:
class BaseService
def handle_errors
yield
rescue RequestTimeout => e # <-- the problem
p e.message
end
end
class FirstService < BaseService
class RequestTimeout < StandardError; end
def first_service_method
handle_errors do
raise RequestTimeout, "FirstService RequestTimeout"
end
end
end
class SecondService < BaseService
class RequestTimeout < StandardError; end
def second_service_method
handle_errors do
raise RequestTimeout, "SecondService RequestTimeout"
end
end
end
a = FirstService.new
a.first_service_method
大洋洲。我可以通过更改来解决问题:
rescue RequestTimeout => e
自:
rescue => e
但我不想这样做,因为我不想捕获由我定义和提出的多个异常(超过 RequestTimeout)。任何帮助都会很棒!
有一个移动的选项
class RequestTimeout < StandardError; end
声明到基类中。因此,所有儿童都可以使用。
无论您对不同的子类有不同的例外,您都被迫使用命名空间,正如@Marek兄弟评论中所述。
问题在于命名空间 - RequestTimeout
是在与BaseService
不同的命名空间中定义的。您应该具备:
rescue FirstService::RequestTimeout => e