温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ruby是如何处理异常的

发布时间:2026-09-30 01:31:01 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 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 及其子类,不要直接 rescue Exception


三、获取异常对象

begin
  raise "出错了"
rescue => e
  puts e.class
  puts e.message
  puts e.backtrace
end

常见异常对象方法:

  • message:错误信息
  • backtrace:调用栈
  • class:异常类型

四、ensure(无论是否异常都会执行)

begin
  puts "执行"
rescue
  puts "异常"
ensure
  puts "总是执行"
end

常用于:

  • 关闭文件
  • 释放资源
  • 清理状态

五、else(无异常时执行)

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(重试)

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 类型错误

十、最佳实践

✅ 推荐:

  • rescue 具体异常
  • 使用 ensure 释放资源
  • 自定义业务异常继承 StandardError

❌ 避免:

  • rescue Exception
  • 吞掉异常不处理
  • 滥用 retry

如果你愿意,我也可以:

  • 给你一个 文件读取的完整异常处理示例
  • 对比 Ruby vs Java / Python 异常处理
  • 讲 Rails 中的异常处理机制
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手