zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++ Primer注意事项11_运算符重载_算术/关系运算符_下标运算符
    android最新的工具DateHelper
    ssh否password登陆server
    atitit.设计模式(2) -----查询方式/ command 总结
    采用Eclipse中间Maven构建Web项目错误(一)
    dm8148 jpeg编解码器测试
    C++ 结构体和类的区别
    C++ const
    C++中的inline函数
    C++ 模板类demo
  • 原文地址:https://www.cnblogs.com/fanxiaopeng/p/3472963.html
Copyright © 2011-2022 走看看