Rails:救援类继承
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:救援类继承相关的知识,希望对你有一定的参考价值。
我有一份有run
方法的工作,看起来像这样:
def perform(share, document)
@history = document.scheduled_posts.find_by(provider: share[:provider])
job = ProviderJob.new(document, share)
begin
job.run
@history.update_columns(response: 'posted', status: 'complete')
rescue StandardError => e
@history.update_columns(response: e.message, status: 'error')
raise Errors::FailedJob, e.message
rescue FbGraph2::Exception::Unauthorized, Twitter::Error::Unauthorized, Mailchimp::UserUnknownError, LinkedIn::OAuthError, Errors::MissingAuth => e
@history.update_columns(response: e.message, status: 'unauthorised')
raise Errors::FailedJob, e.message
end
end
即使Errors::MissingAuth
被提升,StandardError
块也会抓住它,因为它继承了它。如何确保正确的块捕获指定的异常?
答案
这些救援块按顺序执行。你应该先把更具体的一些。移动那个StandardError
最后一个。
另一答案
救援区按顺序运行。因为Errors :: MissingAuth继承自StandardError,所以StandardError块将始终首先触发。您应该更改救援块的优先级,例如:
def perform(share, document)
@history = document.scheduled_posts.find_by(provider: share[:provider])
job = ProviderJob.new(document, share)
begin
job.run
@history.update_columns(response: 'posted', status: 'complete')
rescue FbGraph2::Exception::Unauthorized, Twitter::Error::Unauthorized, Mailchimp::UserUnknownError, LinkedIn::OAuthError, Errors::MissingAuth => e
@history.update_columns(response: e.message, status: 'unauthorised')
raise Errors::FailedJob, e.message
rescue StandardError => e
@history.update_columns(response: e.message, status: 'error')
raise Errors::FailedJob, e.message
end
end
另一答案
如果其他答案有效,我认为这是一种更好的方法。我没有意识到这一点,并开始输入另一个答案,所以无论如何我都会包含它。
我假设这里的所有错误都继承自StandardError。在这种情况下,您可以使用单个救援,并根据引发的错误的类配置行为:
rescue StandardError => e
status = [
FbGraph2::Exception::Unauthorized, Twitter::Error::Unauthorized,
Mailchimp::UserUnknownError, LinkedIn::OAuthError, Errors::MissingAuth
].include?(e.class) ? 'unauthorized' : 'error'
@history.update_columns(response: e.message, status: status)
raise Errors::FailedJob, e.message
end
以上是关于Rails:救援类继承的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ruby on rails 中结合救援多个异常?
以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?
Rails“多重继承”模型-具有另一个类的属性的ActiveRecord对象?