📜  红宝石 |异常处理(1)

📅  最后修改于: 2023-12-03 14:56:47.425000             🧑  作者: Mango

红宝石 | 异常处理

在编写程序时,难免会遇到一些错误和异常情况。为了让程序更加健壮和稳定,我们需要使用异常处理来捕获和处理这些异常情况。在 Ruby 中,也有强大的异常处理机制,让我们来学习一下吧!

异常处理的基本语法

在 Ruby 中,我们可以使用 beginend 块来包含可能引发异常的代码块。如果在 beginend 块中发生了异常,我们可以使用 rescue 块来捕获并处理该异常。

下面是一个简单的示例:

begin
  # 可能引发异常的代码块
rescue ExceptionName
  # 处理该异常的代码块
end

在上面的代码中,ExceptionName 是需要捕获的异常名称。如果指定了异常名称,则只会捕获该类型的异常;如果没有指定异常名称,则会捕获所有类型的异常。捕获到异常后,会执行 rescue 块中的代码,并继续执行程序的剩余部分。

异常类型

在 Ruby 中,有很多种异常类型。下面是一些常见的异常类型及其含义:

  • StandardError:大多数常见的异常类型,如 ArgumentErrorNoMethodError 等。
  • SystemExit:表示程序退出时抛出的异常类型。
  • SignalException:表示信号异常类型,如 InterruptKill 等。
  • Exception:所有异常的祖先类。

另外,我们还可以自定义异常类型,以满足特定的业务需求。

多重 rescue 块

beginend 块中,我们可以使用多个 rescue 块来捕获不同类型的异常。具体语法如下:

begin
  # 可能引发异常的代码块
rescue ExceptionType1
  # 处理 ExceptionType1 类型的异常
rescue ExceptionType2
  # 处理 ExceptionType2 类型的异常
rescue
  # 处理所有其他类型的异常
ensure
  # 一定会执行的代码块
end

在上面的代码中,最后一个 rescue 块没有指定异常类型,它会处理所有没有被前面的 rescue 块捕获的异常。另外,ensure 块里的代码一定会被执行,无论是否发生了异常。

抛出异常

在 Ruby 中,我们可以使用 raise 语句手动抛出一个异常。具体语法如下:

raise ExceptionType, "Exception message"

在上面的代码中,ExceptionType 是异常类型,"Exception message" 是异常信息。抛出异常后,程序会立即停止执行当前块并跳转到最近的 rescue 块。

实战案例

下面是一个简单的实战案例,它演示了如何使用异常处理来实现一个除法运算器:

def divide(a, b)
  begin
    c = a / b
    puts "Result: #{c}"
  rescue ZeroDivisionError
    puts "Error: Division by zero"
  rescue TypeError
    puts "Error: Invalid operand type"
  rescue
    puts "Error: Unknown error occurred"
  ensure
    puts "Thanks for using!"
  end
end

divide(10, 0)
divide(10, "abc")
divide(10, 3)

在上面的代码中,divide 方法接收两个参数 ab,并尝试将它们相除。在 beginend 块中,我们执行了除法运算并打印了结果。如果除数为零,会捕获 ZeroDivisionError 类型的异常;如果操作数类型不正确,会捕获 TypeError 类型的异常;如果是其他类型的异常,会捕获所有类型的异常。

通过这个案例,我们可以看到异常处理的强大和便利之处。它能够在程序出错时给出友好的提示,避免程序崩溃和数据损失。