`

raise-Ruby 异常处理(转载)

    博客分类:
  • RUBY
 
阅读更多
Ruby 异常处理(转载)
异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。

ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
Ruby代码

raise                                     #抛出一个默认的RuntimeError 
raise "Some error message"                #抛出一个消息为"Some error message"的RuntimeError 
raise ArgumentError                       #抛出一个无消息的ArgumentError 
raise ArgumentError, "Bad data"           #抛出一个消息为"Bad data"的ArgumentError 
raise ArgumentError.new("Bad data")       #同上 
raise ArgumentError ArgumentError, "Bad data", caller[0]  #抛出一个包含消息的格式为filename:line 或者 filename:line:in 'method' 的异常 

以上代码中的raise可以使用别名fail代替,在没有明确的给出异常类型时,ruby默认抛出RuntimeError,其中最后一个例子抛出的信息 包含了当前错误所在的文件,行数已经所在的方法的信息,这些信息都存储在caller这个数组中,里面包含了方法调用者的相关信息,第一个元素包 含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用 的。

Ruby代码
 

def func1 
puts caller              #打印调用者信息 
end

def func2 
func1                    #第六行 
end

def func3 
func2                    #第十行 
end

func3                    #最终调用者,十三行 

#运行结果 
#test.rb:6:in `func2' 
#test.rb:10:in `func3' 
#test.rb:13 
      



从上面的代码可以看出,caller记录了每个调用者所在的文件名,行数以及方法。

上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何进行异常的捕捉的,在java中,异常 的捕捉是在try ... catch当中进行,而ruby则是在begin ... end代码块中进行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
Ruby代码
begin 
    ......                               #可能出现异常的代码  
rescue  errorType1            #要捕捉的异常类型  
    ......                               #处理异常的代码  
rescue  errorType2            #要捕捉的异常类型  
    ......                               #处理异常的代码  
end 


以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:
Ruby代码
begin 
    ......                               #可能出现异常的代码  
rescue  errorType1            #要捕捉的异常类型  
    ......                               #处理异常的代码  
rescue  errorType2            #要捕捉的异常类型  
    ......                               #处理异常的代码  
else 
    ......                               #如果以上代码类型都没有捕捉到,则运行该段代码  
end 

begin
    ......                               #可能出现异常的代码
rescue  errorType1            #要捕捉的异常类型
    ......                               #处理异常的代码
rescue  errorType2            #要捕捉的异常类型
    ......                               #处理异常的代码
else
    ......                               #如果以上代码类型都没有捕捉到,则运行该段代码
end

这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:
Ruby代码
begin 
   raise ArgumentError, "Bad data" 
rescue => err  
  puts err  
end 


通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看 看下面的代码:
Ruby代码
begin 
   raise ArgumentError, "Bad data" 
rescue => err  
  puts err  
ensure 
  ...                       #执行清理工作  
end 


从上面代码我们看到,ruby提供了一个关键字ensure,它的作用和java中的finally一样,无论任何异常,该关键字下的代码都必然 会在退出代码块前执行。同时,ruby还提供恢复功能,如果在抛出异常并进行异常处理后我们需要进行恢复工作,那就是使用retry就会重新执行代码块 了。

上面提到,异常的捕捉处理必须在begin-end代码块中进行,那是不是无论什么时候都要书写begin-end这两个关键字呢?其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。
分享到:
评论

相关推荐

    Python学习--异常处理思维导图

    Python学习--异常处理思维导图!!来源于网易云课堂王顺子

    Ruby-NestyRuby的嵌套异常

    1. **嵌套异常信息**:Nesty可以保存每个`rescue`块中发生的完整异常链,这样在处理异常时,你可以获取到完整的错误上下文。 2. **自定义异常类型**:除了标准的Ruby异常类,Nesty还允许创建自定义异常类型,这有助...

    Ruby - Ruby for Rails

    - **异常处理**:探讨 Ruby 中的异常处理机制,包括 raise 和 rescue 关键字的使用。 - **递归函数**:学习如何使用递归函数解决复杂问题。 ### 三、内置类和模块 #### 3.1 内置必需类 - **基本数据类型**:介绍 ...

    大型数据库系统技术课程 4-1-数据库异常处理 共87页.ppt

    处理异常的情态通常在`exception`关键字后定义,通过`when`子句指定异常名称,并跟随处理错误的语句序列。可以使用`or`连接处理多个异常,例如处理`no_data_found`和`too_many_rows`异常。`when others then`语句...

    掌握Ruby的异常处理:优雅应对错误的艺术

    ### 掌握 Ruby 的异常处理:优雅应对错误的艺术 #### 引言 异常处理作为编程中的基础技能之一,在任何一种编程语言中都占有极其重要的地位。对于 Ruby 这种注重简洁性和可读性的语言而言,良好的异常处理机制更是不...

    Python基础教程-第9章-异常处理-.ppt

    - 重新抛出异常:在处理异常后,可以使用`raise`不带参数的形式将异常重新抛出,以便在上层代码中处理。 学习Python的异常处理对于编写健壮的程序至关重要,它能够帮助你预测并解决潜在的问题,避免程序无故崩溃,...

    ruby使用文档

    - 异常类如`StandardError`、`RuntimeError`等,可以通过`raise`抛出异常。 7. **元编程**: - Ruby的元编程能力强大,可以在运行时修改类和对象的行为。 - `class_eval`、`instance_eval`、`define_method`等...

    Python应用开发-异常处理.pptx

    Python提供了try、except、raise语句来实现异常处理。 2.8 异常处理 2.8.1 异常处理例 在Python中,异常处理是通过try、except语句来实现的。try语句块中包含可能出现错误的代码,except语句块中包含错误处理代码...

    Oracle_存储过程exception异常处理大全及实例经典最终.docx

    RAISE 语句是 PL/SQL 异常处理机制的另一个重要部分,用于抛出异常。例如,RAISE_APPLICATION_ERROR(-20001, 'Error message'); 结论 ---- Oracle 存储过程 exception 异常处理大全及实例经典最终是 Oracle 数据库...

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert

    Python零基础速成班,适用于入门或初级学习人群,采用Jupyter Notebook原装教程,.ipynb格式拷贝到Jupyter Notebook目录下即可运行,网页交互式可视化Python编程,全中文注解,下载即用,对初学者非常友好,也可作为...

    raise-alarm:向该页面上连接的所有客户端发出警报

    $ npm install raise-alarm -g $ raise-alarm 选项 -h, --help output usage information -V, --version output the version number -p, --port [number] specified the port 服务器 $ git clone --depth=1 --...

    python烟花代码-25-自定义异常代码实现之捕获异常.ev4.rar

    # 处理异常 ... finally: # 总是执行的代码 ... ``` 在复杂的异常处理场景中,还可以使用`except`来捕获多种类型的异常,或者使用`except Exception as e`来捕获所有未被明确捕获的异常。此外,`else`块可以在`...

    Ruby In a Nutshell

    - `begin-rescue-end`用于捕获和处理异常。 - `raise`用于引发异常,`ensure`确保在任何情况下执行的代码。 7. **块(Block)和闭包** - 块是Ruby中的匿名函数,由`do..end`或花括号`{}`定义,可以与方法一起...

    Python自学教程-22-自定义异常的作用.ev4.rar

    2. **抛出自定义异常**:当遇到需要自定义错误处理的情况时,可以使用`raise`语句抛出自定义异常,附带相关错误信息。 ```python try: # 一些可能会引发异常的代码 raise CustomException("发生了一个自定义错误...

    Python自学教程-11-体验异常.ev4.rar

    本教程"Python自学教程-11-体验异常.ev4"着重于帮助学习者理解和掌握如何在Python中处理异常,以确保程序在遇到错误时能够优雅地运行而不是突然崩溃。 异常是程序在执行过程中遇到的问题或错误,如除以零、打开不...

    Ruby语言入门教程v1.0

    - Ruby提供了异常处理机制,通过`begin...rescue...end`块捕获和处理错误。 - `raise`关键字用于抛出异常,`ensure`确保在任何情况下都会执行的代码。 - 测试是软件开发的重要部分,Ruby有内置的测试框架如Test::...

    python烟花代码-24-自定义异常代码实现之异常类.ev4.rar

    在Python编程语言中,异常处理是一项重要的功能,它允许我们优雅地处理程序运行时可能出现的错误。本资源“python烟花代码-24-自定义异常代码实现之异常类.ev4.rar”显然关注的是如何在Python中自定义异常类,这在...

    c,c++异常处理

    - **结构化异常**: 这是微软特定的一种异常处理方式,主要用于Windows平台,可以通过`__try`和`__except`块来捕获和处理异常。 ##### 1.2 异常的生命阶段 异常的生命周期分为以下几个阶段: 1. **发生阶段** ...

    精品课件-Python常见异常处理.pptx

    - 使用`try/except`语句可以捕获并处理异常。例如: ```python try: # 可能引发异常的代码 except ExceptionType: # 处理特定类型的异常 except: # 捕获所有其他类型的异常 finally: # 无论是否发生异常...

Global site tag (gtag.js) - Google Analytics