处理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

results matching ""

    No results matching ""