先看看ruby中的异常知识:
异常处理raise
例子:
raise raise "you lose" raise SyntaxError.new("invalid syntax") raise SyntaxError, "invalid syntax"
语法:
raise
raise message
raise exception
raise error_type, message
引发异常。第一句将再次引发上一个异常。第二句中(参数为字符串的情况),就把那个字符串信息当作错误信息再引发 RuntimeError 异常。第三句中(参数为异常对象的情况),则引发该异常。第四句中,将引发第一个参数所指的异常,并以第二个参数的内容作为错误信息。
可以使用 begin 表达式的 rescue 部分来捕捉异常。
raise 并不是 Ruby 的保留字,而是内部函数。
begin
例子:
begin
do_something
rescue
recover
ensure
must_to_do
end
语法:
begin
表达式 ..
[rescue [error_type,..] [then]
表达式 ..]..
[ensure
表达式 ..]
end
若给出了 rescue 部分(可以有若干个)的话,就可以在发生异常时捕捉到它。若存在与异常类型一致的 rescue 部分的话,就执行 rescue 的内容。发生异常时,可以使用内部变量 $! 来查看异常的情况。
若 error_type 被省略,则将捕捉 StandardError 的子类中的所有异常。 Ruby 的大部分内部异常是 StandardError 的子类。具体请参考 内部异常类。
在 rescue 部分中,error_type 与普通的参数一样接受计算,若符合的话就执行相应部分的内容。若 error_type 的计算值既非类又非模块的话,则引发 TypeError 异常。
若存在 ensure 部分的话,则在 begin 表达式结束之前一定会计算它。
begin 表达式会返回其自身或 rescue 部分最后的计算结果。
rescue 修饰符
例子:
File.open("file") rescue print "can't open "
语法:
表达式1 rescue 表达式2
若表达式 1 中发生异常时就计算表达式 2。不能指定想捕捉的异常类(也就是说,只能捕捉 StandardError 异常类的子类了)。
在包含 rescue 修饰符的表达式中,若没发生异常则返回表达式 1 的值,若发生异常则返回表达式 2 的值。
JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。JRuby 项目可以将Ruby 代码编译为Java 字节码。
调用java的时候,如果java抛出的异常,jruby捕获到,会给其封装一层,java异常会成为NativeException的子类,可使用如下方式捕获:
begin #.................... rescue NativeException => e case e
when Exception1 when Exception2 end rescue Exception => e
#....................
ensure
#....................
end
参考:http://www.jruby.org/apidocs/org/jruby/NativeException.html