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