处理error的一般语法
#处理error的一般语法
begin
p 8/0
rescue
p "rescued the error"
end
具体到某一个具体问题的语法
#下面只能抓取特定错误,如果不是ZeroDivisionError错误,则不会被抓取
begin
p 8/0
rescue ZeroDivisionError => e
p "rescued the error: #{e}" #"rescued the error: divided by 0"
end
#不会抓取非ZeroDivisionError错误
begin
p nil+10
rescue ZeroDivisionError=> e
p "rescued the error: #{e}"
end
#这段代码报错,undefined method `+' for nil:NilClass (NoMethodError)
#解决方式,使用StandardError,这个类是ZeroDivisionError的父类
begin
p nil+10
rescue StandardError=> e
p "rescued the error: #{e}" #"rescued the error: undefined method `+' for nil:NilClass"
end
定制错误,将错误日志保存在文件中
def error_logger(e)
File.open("error_log.txt", "a") do |file|
file.puts e
end
end
begin
puts 8/0
rescue StandardError => e
error_logger("Error: #{e} at #{Time.now}")
end
在ruby2.5中,rescue/else/ensure are allowed inside do/end blocks without begin/end
#{}中添加begin/end
[1].each { |n|
begin
n / 0
rescue
puts "hello"
else
puts "world"
ensure
puts "finished"
end
} #hello, finished
#{}中没有begin/end会报错
[1].each { |n|
n / 0
rescue
puts "hello"
else
puts "world"
ensure
puts "finished"
} #error
#do/end中可以没有begin/end
[1].each do |n|
n / 0
rescue
puts "hello"
else
puts "world"
ensure
puts "finished"
end #hello, finished