抛出和捕获异常

1. 异常处理的重要性

在编程过程中,异常(Exception)是指程序在执行过程中遇到的错误或意外情况。异常处理是编程中非常重要的一部分,因为它允许程序在遇到错误时不会崩溃,而是能够优雅地处理这些错误并继续执行。

2. Ruby 中的异常类层次结构

在 Ruby 中,异常是通过类来表示的。所有的异常类都继承自 Exception 类。常见的异常类包括:

  • StandardError:大多数标准异常的基类。
  • RuntimeError:当没有指定异常类型时,默认抛出的异常。
  • NoMethodError:当调用一个不存在的方法时抛出。
  • ArgumentError:当方法的参数不正确时抛出。

3. 抛出异常

在 Ruby 中,可以使用 raise 关键字来抛出异常。raise 可以接受一个字符串或一个异常类的实例。

3.1 使用字符串抛出异常

raise "这是一个自定义的异常信息"

3.2 使用异常类抛出异常

raise ArgumentError, "参数不正确"

3.3 使用 RuntimeError 抛出异常

raise "这是一个默认的 RuntimeError 异常"

4. 捕获异常

在 Ruby 中,可以使用 begin...rescue...end 结构来捕获和处理异常。rescue 块用于处理捕获到的异常。

4.1 基本捕获异常

begin
  # 可能会抛出异常的代码
  raise "这是一个异常"
rescue
  # 处理异常的代码
  puts "捕获到一个异常"
end

4.2 捕获特定类型的异常

begin
  # 可能会抛出异常的代码
  raise ArgumentError, "参数不正确"
rescue ArgumentError => e
  # 处理 ArgumentError 异常
  puts "捕获到 ArgumentError 异常: #{e.message}"
end

4.3 捕获多个异常

begin
  # 可能会抛出异常的代码
  raise ArgumentError, "参数不正确"
rescue ArgumentError => e
  puts "捕获到 ArgumentError 异常: #{e.message}"
rescue StandardError => e
  puts "捕获到其他标准异常: #{e.message}"
end

5. 自定义异常

在 Ruby 中,你可以创建自定义的异常类。自定义异常类通常继承自 StandardError 或其子类。

5.1 创建自定义异常类

class MyCustomError < StandardError
  def initialize(msg = "这是一个自定义异常")
    super(msg)
  end
end

5.2 抛出自定义异常

begin
  raise MyCustomError, "这是一个自定义的异常信息"
rescue MyCustomError => e
  puts "捕获到 MyCustomError 异常: #{e.message}"
end

6. 实践练习

6.1 练习1:捕获并处理文件读取异常

编写一个 Ruby 脚本,尝试读取一个不存在的文件,并捕获 Errno::ENOENT 异常。

begin
  File.read("non_existent_file.txt")
rescue Errno::ENOENT => e
  puts "文件不存在: #{e.message}"
end

6.2 练习2:自定义异常处理

编写一个 Ruby 脚本,定义一个自定义异常 InvalidInputError,并在用户输入无效数据时抛出该异常。

class InvalidInputError < StandardError
  def initialize(msg = "输入无效")
    super(msg)
  end
end

begin
  print "请输入一个数字: "
  input = gets.chomp
  raise InvalidInputError, "输入必须是数字" unless input =~ /^\d+$/
  puts "你输入的数字是: #{input}"
rescue InvalidInputError => e
  puts "捕获到 InvalidInputError 异常: #{e.message}"
end

7. 总结

异常处理是编程中不可或缺的一部分,它允许程序在遇到错误时能够优雅地处理这些错误并继续执行。通过 raise 关键字,你可以抛出异常;通过 begin...rescue...end 结构,你可以捕获和处理异常。此外,你还可以创建自定义异常类来更好地管理程序中的错误。

希望这篇教程能帮助你理解 Ruby 中的异常处理机制,并通过实践练习加深你的理解。