Ruby异常17 Mar 2025 | 5 分钟阅读 Ruby 异常是一个对象,是 Exception 类或该类的后代的实例。 它代表一些异常情况。 在 Ruby 程序中,当出现错误时,它会抛出异常行为。 默认情况下,Ruby 程序会在抛出异常时终止。 我们可以在 Ruby 中声明一些异常处理程序。 异常处理程序是一段代码,当其他代码块中发生异常时,该代码块将被执行。 异常的处理方式有两种。 要么终止程序,要么处理异常。 要处理异常,您可以提供一个 rescue 子句。 通过提供此子句,程序控制流将流向 rescue 子句。 当引发异常但未处理时,全局变量 $! 包含当前异常,而 $@ 包含当前异常的回溯。 Ruby 预定义的类(如 Exception 及其子类)可帮助您处理程序中的错误。 在 Ruby 异常层次结构中,大多数子类都扩展了 StandardError 类。 这些是正常的异常。 Ruby 类异常内置异常子类如下:
示例 输出 ![]() raise 方法来自 Kernel 模块。 处理异常要处理异常,引发异常的代码包含在 begin-end 块中。 使用 rescue 子句,我们可以声明要处理的异常类型。 示例 输出 ![]() 在上面的例子中,中断的代码没有完全运行。 异常处理后,代码会在 begin-end 块之后恢复。 如果在 rescue 子句中未定义任何参数,则该参数默认为 StandardError。 每个 rescue 子句都指定要捕获的多个异常。 如果 raise 在没有任何参数的情况下使用,异常可能会被重新引发。 rescue 子句写在 begin/rescue 块中。 如果一个 rescue 子句无法处理异常,则将由下一个 rescue 子句处理。 在 begin 块中,将把每个带有引发异常的 rescue 子句与每个参数依次进行比较。 当抛出的错误类型和 rescue 子句中命名的异常类型相同,或者 rescue 子句中命名的异常类型是该异常的超类时,它将被匹配。 如果 begin 语句的主体在没有异常的情况下完成,则执行 else 子句。 如果发生异常,则 else 子句将不会执行。 异常对象异常对象是普通对象。 捕获的异常可以保存在 rescue 子句中的变量中。 示例 Exception 类定义了两个返回有关异常详细信息的方法。 message 方法返回一个字符串,该字符串定义了错误的说明。 backtrace 方法返回一个字符串数组,该数组表示引发异常时的调用堆栈。 使用 retry 语句通常,在 rescue 子句中,异常被捕获,代码在 begin 块之后恢复。 使用 retry 语句,在捕获异常后,可以从 begin 恢复 rescue 块代码。 语法 示例 上面的程序运行方式如下 步骤 1 在 begin 块中,编写代码以创建一个已存在的目录。 步骤 2 这将引发错误。 步骤 3 在 rescue 块中,y 被重新赋值。 步骤 4 retry 语句将转到 begin 块。 步骤 5 目录将被创建。 使用 raise 语句raise 语句用于引发异常。 语法 或者, 或者, 或者, 第一个重新引发当前异常。 它用于异常处理程序,在异常传递之前拦截异常。 第二个创建一个新的 RuntimeError 异常。 然后,此异常将沿调用堆栈向上引发。 第三个使用第一个参数创建异常,然后将关联的消息设置为第二个参数。 第四个与第三个类似。 在这里,您可以添加任何条件语句以引发异常。 示例 输出 ![]() 使用 ensure 语句有一个 ensure 子句,它保证在代码末尾进行一些处理。 无论是否引发异常,ensure 块始终运行。 它位于最后一个 rescue 子句之后,并且始终在块终止时执行。 无论是否出现异常,是否捕获了异常,或者是否因未捕获的异常而终止代码,ensure 块都将运行。 语法 示例 输出 ![]() 使用 else 语句else 子句始终存在于 rescue 子句之后,ensure 子句之前。 如果未引发任何异常,则仅执行 else 块。 语法 示例 输出 ![]() Ruby Catch 和 Throw当代码中不再需要进一步工作时,Ruby catch 和 throw 提供了一种提前从执行中跳出的方法。 catch 定义一个用给定名称标记的块。 它用于跳出嵌套代码。 使用 catch,该块将正常执行,直到遇到 throw。 catch 和 throw 方法比 rescue 和 raise 子句更快。 因此,更适合使用。 语法 或者, 示例 输出 ![]() 下一个主题Ruby OOPs |
我们请求您订阅我们的新闻通讯以获取最新更新。