异常处理的结构:
begin #开始
raise.. #抛出异常
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
$! #表示异常信息
$@ #表示异常出现的代码位置
else #其余异常
..
ensure #不管有没有异常,进入该代码块
end #结束
raise.. #抛出异常
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
$! #表示异常信息
$@ #表示异常出现的代码位置
else #其余异常
..
ensure #不管有没有异常,进入该代码块
end #结束
可以结合$!错误原因,和$@错误位置做一个错误捕获并提示的小程序,比如:
1 begin
2 puts
3 puts "file: #{name = ARGV.shift}"
4 file = open(name)
5 i = 0
6 file.read.each_line{|line| puts "#{i+=1}.#{line}" }
7 rescue
8 puts "error:#{$!} at:#{$@}"
9 ensure
10 file.close
11 end
2 puts
3 puts "file: #{name = ARGV.shift}"
4 file = open(name)
5 i = 0
6 file.read.each_line{|line| puts "#{i+=1}.#{line}" }
7 rescue
8 puts "error:#{$!} at:#{$@}"
9 ensure
10 file.close
11 end
上面的小程序读入一个指定的文件并加入行号进行输出,当产生错误时会输出错误信息以及提示,可以故意输入一个不存在的文件名。
其实 begin相当于c#的try
rescue相当于c#的catch
ensure相当于c#的 finaly
raise相当于c#的 throw
异常类的结构为:
- Exception
- (Interrupt) (ruby 1.7 特性 version 1.6以前的位置)
- NoMemoryError
- scrīptError
- LoadError
- (NameError) (ruby 1.7 特性 version 1.6以前的位置)
- NotImplementedError
- SyntaxError
- SignalException
- Interrupt (ruby 1.7 特性)
- StandardError
- ArgumentError
- IndexError
- KeyError (ruby 1.9 特性)
- IOError
- LocalJumpError
- NameError (ruby 1.7 特性)
- NoMethodError (ruby 1.7 特性)
- RangeError
- RegexpError
- RuntimeError
- SecurityError
- SystemCallError
- SystemStackError
- ThreadError
- TypeError
- ZeroDivisionError
- SystemExit
- fatal