在 Ruby 中,异常处理主要通过 begin ... rescue ... ensure ... end 结构来完成。下面从基础到常见用法系统地说明。
begin
# 可能抛出异常的代码
result = 10 / 0
rescue
# 发生异常时执行
puts "发生错误了"
end
当 begin 中的代码抛出异常时,会跳到 rescue 中执行。
begin
File.open("not_exist.txt")
rescue Errno::ENOENT
puts "文件不存在"
end
可以指定多个 rescue:
begin
# some code
rescue ZeroDivisionError
puts "除以零"
rescue StandardError => e
puts "其他错误: #{e.message}"
end
✅ 推荐只 rescue
StandardError及其子类,不要直接 rescueException
begin
raise "出错了"
rescue => e
puts e.class
puts e.message
puts e.backtrace
end
常见异常对象方法:
message:错误信息backtrace:调用栈class:异常类型begin
puts "执行"
rescue
puts "异常"
ensure
puts "总是执行"
end
常用于:
begin
x = 1 + 1
rescue
puts "error"
else
puts "没有异常,结果是 #{x}"
ensure
puts "结束"
end
执行顺序:
begin → (无异常)else → ensure
begin → (有异常)rescue → ensure
raise "出错了"
raise ArgumentError, "参数错误"
也可以自定义异常:
class MyError < StandardError; end
raise MyError, "自定义异常"
retry_count = 0
begin
retry_count += 1
raise "失败" if retry_count < 3
rescue
puts "重试第 #{retry_count} 次"
retry
end
⚠️ 使用 retry 要非常小心,避免死循环。
如果整个方法体都需要异常捕获,可以省略 begin:
def foo
raise "error"
rescue
puts "捕获异常"
end
| 异常类 | 说明 |
|---|---|
StandardError |
大多数异常的基类 |
RuntimeError |
raise 默认异常 |
ArgumentError |
参数错误 |
NoMethodError |
调用不存在的方法 |
NameError |
未定义变量 |
ZeroDivisionError |
除零 |
TypeError |
类型错误 |
✅ 推荐:
ensure 释放资源StandardError❌ 避免:
rescue Exceptionretry如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。