首页 > 学院 > 开发设计 > 正文

详解Ruby中的异常

2019-10-26 19:25:49
字体:
来源:转载
供稿:网友

异常和执行总是被联系在一起。如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的。

如果异常发生,则程序停止。异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止。

Ruby 提供了一个完美的处理异常的机制。我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型。
语法

begin # - rescue OneTypeOfException # - rescue AnotherTypeOfException # - else # 其他异常ensure# 总是被执行end

从 begin 到 rescue 中的一切是受保护的。如果代码块执行期间发生了异常,控制会传到 rescue 和 end 之间的块。

对于 begin 块中的每个 rescue 子句,Ruby 把抛出的异常与每个参数进行轮流比较。如果 rescue 子句中命名的异常与当前抛出的异常类型相同,或者是该异常的父类,则匹配成功。

如果异常不匹配所有指定的错误类型,我们可以在所有的 rescue 子句后使用一个 else 子句。
实例

#!/usr/bin/ruby begin  file = open("/unexistant_file")  if file   puts "File opened successfully"  endrescue   file = STDINendprint file, "==", STDIN, "/n"

这将产生以下结果。您可以看到,STDIN 取代了 file ,因为打开失败。
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
使用 retry 语句

您可以使用 rescue 块捕获异常,然后使用 retry 语句从开头开始执行 begin 块。
语法

begin  # 这段代码抛出的异常将被下面的 rescue 子句捕获rescue  # 这个块将捕获所有类型的异常  retry # 这将把控制移到 begin 的开头end实例#!/usr/bin/ruby begin  file = open("/unexistant_file")  if file   puts "File opened successfully"  endrescue  fname = "existant_file"  retryend

以下是处理流程:

        打开时发生异常。     跳到 rescue。fname 被重新赋值。     通过 retry 跳到 begin 的开头。     这次文件成功打开。     继续基本的过程。

注意:如果被重新命名的文件不存在,本势力代码会无限尝试。所以异常处理时,谨慎使用 retry。
使用 raise 语句

您可以使用 raise 语句抛出异常。下面的方法在调用时抛出异常。它的第二个消息将被输出。
语法

raise OR raise "Error Message" OR raise ExceptionType, "Error Message" OR raise ExceptionType, "Error Message" condition

第一种形式简单地重新抛出当前异常(如果没有当前异常则抛出一个 RuntimeError)。这用在传入异常之前需要解释异常的异常处理程序中。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表