在没有开始和结束块的情况下,如何在Ruby中使用抢救


Answers:


223

方法“ def”可以用作“ begin”语句:

def foo
  ...
rescue
  ...
end

3
同样,类定义,模块定义和(我认为)do/ end块文字形成隐式异常块。
约尔格W¯¯米塔格

您可以同时进行保全救援吗?
Mohamed Hafez 2013年

您也可以绝对确保完成救援工作:-)
安东尼

您可以在防御中使用多个救援吗?
2015年

@ marriedjane875是的,您可以使用多个救援,或者明确地使用(每个救援子句/自己的行中的代码),例如rescue TypeError; rescue NameError-或用逗号分隔异常类,例如rescue TypeError, NameError
chemturion

48

您还可以在线救援:

1 + "str" rescue "EXCEPTION!"

将打印出“ EXCEPTION!” 因为“无法将字符串强制转换为Fixnum”


1
如何挽救并显示内联异常回溯?
西里尔·杜尚-多丽丝

如何返回实际异常?
user1735921

1
内联抢救并不是一种好的做法,因为它会抢救StandardError及其所有子类,例如NameError–意味着即使您的代码中有错字也不会引发错误。。请参阅Thoughtbot.com/blog/don-t-inline-rescue-in-红宝石
BrunoFacca

26

我在ActiveRecord验证中经常使用def / result组合:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

我认为这是非常精简的代码!


19

例:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

在这里,def作为begin声明:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.