jruby中的异常

先看看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

原文地址:https://www.cnblogs.com/fanxiaopeng/p/3472963.html