ESS多版本 【ESS】10 异常处理

10: 异常处理​

在编程过程中,错误是不可避免的。处理这些错误,以防止程序崩溃,提供有用的错误信息或尝试解决问题,这就是异常处理的目的。

基本异常处理​

Ruby 提供了 begin-rescue 结构来处理异常。基本的语法如下:

Ruby:
begin
  # 可能会发生异常的代码
rescue
  # 处理异常的代码
end

例如:

Ruby:
begin
  # 尝试除以零
  result = 10 / 0
rescue
  # 捕获并处理异常
  print "除数不能为零!"
end

这个代码尝试执行 10 除以 0,这会引发一个异常。rescue 块会捕获这个异常并输出一条错误信息,而不是让程序崩溃。

捕获特定的异常​

你可以捕获特定类型的异常,而不仅仅是所有的异常。Ruby 中的异常类是层次结构的,可以捕获不同层次的异常。

Ruby:
begin
  result = 10 / 0
rescue ZeroDivisionError
  print "除数不能为零!"
rescue StandardError
  print "发生了一个标准错误!"
end

在这个例子中,我们明确捕获 ZeroDivisionError 异常。如果发生其他类型的异常,第二个 rescue 会捕获它。

获取异常信息​

在 rescue 块中,你可以访问异常对象以获取更多信息:

Ruby:
begin
  result = 10 / 0
rescue ZeroDivisionError => e
  print "错误信息: #{e.message}"
  print "错误类型: #{e.class}"
end

ensure 块​

ensure 块中的代码无论是否发生异常都会执行。它通常用于清理资源,如关闭文件或网络连接:

Ruby:
begin
  file = File.open("example.txt", "w")
  # 可能会发生异常的代码
rescue
  print "处理异常..."
ensure
  file.close if file
  print "文件已关闭"
end

raise 语句​

你可以使用 raise 语句手动引发异常:

Ruby:
def divide(a, b)
  raise ArgumentError, "除数不能为零" if b == 0
  a / b
end

begin
  divide(10, 0)
rescue ArgumentError => e
  print "错误: #{e.message}"
end

自定义异常​

你可以创建自定义的异常类来处理特定的错误情况:

Ruby:
class CustomError < StandardError
end

def do_something_risky
  raise CustomError, "发生自定义错误"
end

begin
  do_something_risky
rescue CustomError => e
  print "捕获自定义错误: #{e.message}"
end

重新引发异常​

有时你捕获异常后,处理一些事情并希望重新引发它:

Ruby:
begin
  result = 10 / 0
rescue ZeroDivisionError => e
  print "捕获到错误: #{e.message}"
  raise # 重新引发异常
end
 

在线成员

论坛统计

主题
474
消息
2,137
成员
2,909
最新成员
小灵喵~