《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 无法读取到指定的库

 

posted @ 2020-06-01 01:07  就是想学习  阅读(212)  评论(0编辑  收藏  举报