《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 无法读取到指定的库
浙公网安备 33010602011771号