在 Ruby 中,异常处理主要通过 begin...rescue...ensure...end 结构来完成。下面从基础到常见用法系统地介绍一下。
begin
# 可能出错的代码
result = 10 / 0
rescue
# 发生异常时执行
puts "出错了"
end
Ruby 的异常都继承自 StandardError,推荐只捕获你关心的异常类型。
begin
File.open("not_exist.txt")
rescue Errno::ENOENT => e
puts "文件不存在: #{e.message}"
end
常见异常类型:
StandardError(大多数异常的父类)ArgumentErrorNoMethodErrorRuntimeErrorIOErrorZeroDivisionErrorbegin
raise "出错了"
rescue => e
puts e.class
puts e.message
puts e.backtrace
end
begin
# some code
rescue ZeroDivisionError
puts "除以零"
rescue IOError => e
puts "IO 错误: #{e.message}"
rescue => e
puts "其他错误: #{e.message}"
end
常用于关闭资源、释放连接。
begin
file = File.open("test.txt")
# 处理文件
rescue => e
puts e.message
ensure
file.close if file
end
raise "出错了"
raise ArgumentError, "参数不合法"
raise MyCustomError.new("自定义错误")
自定义异常:
class MyError < StandardError; end
raise MyError, "我的错误"
retry_count = 0
begin
retry_count += 1
raise "失败" if retry_count < 3
rescue
retry if retry_count < 3
end
⚠️ retry 要小心死循环。
如果整个方法体都需要异常处理,可以省略 begin:
def foo
# 可能出错
rescue
puts "出错"
ensure
puts "结束"
end
result = begin
1 / 0
rescue
0
end
puts result # 0
✅ 不要吞掉所有异常
✅ 明确捕获具体异常
✅ 使用 ensure 释放资源
✅ 自定义异常继承 StandardError
❌ 不建议 rescue Exception
# 不推荐
rescue Exception
# 推荐
rescue StandardError
如果你有具体场景(比如 Rails、文件操作、网络请求、重试机制),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。