Ruby:当父类在子类中定义自定义异常时,如何在父类中捕获自定义异常



我对 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

最新更新