《Rubu基础教程第五版》第十章笔记 错误处理和异常
异常错误的分析
Traceback (most recent call last): 1: from new_point.rb:64:in `<main>' new_point.rb:27:in `[]': out of range '2' (ArgumentError)
这么一条异常 from 文件名:行号:in 方法名
文件名:行号:in 方法名:错误信息 (异常的类型)
异常处理的写法
begin rescue end 相当于Python中try except
一个异常的小脚本
shijianongdeMBP:chapter_10 shijianzhong$ cat wc.rb ltotal=0 # 行数统计 wtotal=0 # 单词数统计 ctotal=0 # 字数统计 ARGV.each do |file| begin input = File.open(file) l = 0 # 文件内统计 w = 0 c = 0 input.each_line do |line| l += 1 c += line.size line.sub!(/^\s+/,"") # 删除行首的空白符 ary = line.split(/\s+/) w += ary.size end input.close printf("%8d %8d %8d %s\n",l,w,c,file) ltotal += l wtotal += w ctotal += c rescue => ex print ex.message, "\n" end end
后处理
begin resuce => 变量 ensure end
try except finally
重试,一个蛮有意思的玩意
file = ARGV[0] begin io = File.open(file) rescue sleep retry (重试) end
rescue修饰符
表达式1 rescue 表达式2
n = Integer(val) rescue 0
如果第一个报错,那取值就是0
异常处理语法补充
方法内部,类内部begin~end可以省略begin与end,直接用rescue以及ensure就可以了
指定需要捕捉的异常
begin
...
rescue Exception1, Exception2 => 变量
处理
resuce Exception3 => 变量
处理
end
自定义异常类
自定义的错误类继承与StandardError类。
MyError = Class.new(StandardError)
MyError1 = Class.new(MyError)
这样的自定义错误类第一个,其实跟下面这个写法一样
class MyError < StandardError
end
主动抛出异常
raise "xxxx"
抛出 RuntimeError异常,并在新生成的异常对象中设置作为信息的字符串
raise 异常类
抛出指定类的异常
raiise 异常类 "xxxx"
抛出指定类的异常,并在新生成的异常对象中设置作为信息的字符串
raise
抛出 RuntimeError异常
常见的错误信息
syntax error 语法错误
NameError/NoMethodError 变量名或者方法不存在
ArgumentError 方法传参错误
TypeError 对象方法错误
LoadError require 无法读取到指定的库