我在Rails路由中有以下代码:
class LegacyRedirector
InvalidUrlError = Class.new(ActionController::RoutingError)
def call(params, request)
URI.parse(request.path)
rescue URI::InvalidURIError => e
raise InvalidUrlError.new(e.message)
end
end
# routes.rb
match 'a', to: redirect(LegacyRedirector.new)
这是用于捕获无效URL的。但是,当我在浏览器中测试卷曲时,它仍会显示URI::InvalidURIError
,而不是我的新错误类。似乎从未达到救援块,但我确定我正在救援正确的类型。怎么可能呢?
URI::InvalidURIError at /twitter/typeahead-js/wikis/home[
=========================================================
> bad URI(is not URI?): "/twitter/typeahead-js/wikis/home["
lib/gitlab/routing.rb, line 31
------------------------------
``` ruby
> 31 URI.parse(request.path)
32 rescue URI::InvalidURIError => e
33 raise InvalidUrlError.new(e.message)
34 end
```
答案 0 :(得分:1)
一个可能的原因可能是better_errors
。
如果在救援块中引发错误,则其cause
将是原始错误。 better_errors
改为显示cause
,这意味着回溯将不在抢救块中。这给您一种幻想,它永远都无法挽救。
此问题最近已修复,有关更多详细信息,请参见https://github.com/BetterErrors/better_errors/pull/459