异常处理的结构:
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
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
上面的小程序读入一个指定的文件并加入行号进行输出,当产生错误时会输出错误信息以及提示,可以故意输入一个不存在的文件名。
其实 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