`raise "foo"` 和 `raise Exception.new("foo")` 有什么区别?

2024-03-20

两者之间有什么区别 - 技术、哲学、概念或其他方面

raise "foo"

and

raise Exception.new("foo")

?


从技术上讲,第一个会引发 RuntimeError,消息设置为"foo",第二个引发异常,消息设置为"foo".

实际上,何时使用前者和何时使用后者之间存在显着差异。

简而言之,您可能想要一个RuntimeError not an Exception。没有参数的救援块会捕获RuntimeErrors,但不会抓住Exceptions。所以如果你提出Exception在您的代码中,此代码不会捕获它:

begin
rescue
end

为了抓住Exception你必须这样做:

begin
rescue Exception
end

这意味着从某种意义上来说,Exception是一个比“更糟糕”的错误RuntimeError,因为你必须做更多的工作才能从中恢复。

因此,您想要哪个取决于您的项目如何进行错误处理。例如,在我们的守护进程中,主循环有一个空白救援,它将捕获RuntimeErrors,报告它们,然后继续。但在一两种情况下,我们希望守护进程真的因错误而死亡,在这种情况下,我们会提出一个Exception,它直接通过我们的“正常错误处理代码”并输出。

再说一遍,如果您正在编写库代码,您可能需要一个RuntimeError,不是一个Exception,因为如果您的库的用户出现空白的错误,将会感到惊讶rescue块无法捕获,他们需要一些时间才能意识到原因。

最后,我应该说的是RuntimeError是一个子类StandardError类,实际规则是,虽然你可以raise any对象类型,空白rescue默认情况下只会捕获继承自的任何内容StandardError。其他一切都必须具体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`raise "foo"` 和 `raise Exception.new("foo")` 有什么区别? 的相关文章

随机推荐

  • Groovy - 如何延迟 Groovlet 修改重新编译检查

    我是 Groovy 的新手 我正在考虑使用 Groovlets 不是 GRAILS 来替换一些 Servlet 如果我更改 Groovlet 的脚本文件 Groovlet 会重新编译并自动获取更改 包括从 Groovlet 引用的脚本 这对
  • 具有离散值的圆形 SeekBar

    我正在尝试创建一个具有离散非线性值的圆形搜索栏 我还希望这些值出现在圆圈之外 我从 GitHub 上查看了多个版本 其中最有希望的是JesusM https github com JesusM HoloCircleSeekBar但是 我想不
  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率
  • 非平凡可复制类型的 C++ 值表示

    C 标准的当前草案 2019 年 3 月 有以下段落 basic types p 4 强调我的 T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列 其中 N 等于 sizeof T T 类型对象的值
  • 在 JavaScript 块上使用 HTML 注释仍然有意义吗?

    过去 人们习惯将 HTML 注释标签包裹在 JavaScript 块周围 以防止 旧 浏览器显示脚本 即使 Lynx 足够聪明 可以忽略 JavaScript 那么为什么有些人仍然这样做呢 这些天有什么正当理由吗 编辑 我确实遇到过一种情况
  • 检查是否可以安全地评估符号

    我有一根绳子x 我觉得x是某个类型的子类型的字符串表示形式Number 例如 x可能会取值 Float64 我可以使用以下方法检查这一点 eval parse x lt Number 然而 有可能x包含一些危险的东西 比如一些变体 rm s
  • textFieldDidBeginEditing:没有被调用

    我从下面得到了代码this https stackoverflow com questions 1247113 iphone keyboard covers uitextfield所以问题 当我开始编辑时 我试图向上滑动文本字段 因为否则它
  • MySQL INT 含义

    我想知道如果我采用值为 8 的 INT 这是否意味着我只能从 1 到 99999999 或从 1 到 4294967295 UNSIGNED 该文档似乎对此非常清楚 数字类型属性 MySQL 支持选择性指定显示的扩展 基关键字后面的括号中的
  • CSRF - 仅在第一次登录

    当我在服务器上部署我的应用程序时 第一次我可以毫无问题地登录 但是当我注销时 我在注销发布请求中收到 403 Forbidden 然后我无法成功登录 因为我在登录请求上收到 403 错误 Ctrl F5 尝试再次登录 它可以工作 但只能一次
  • .NET 单委托与多播委托[重复]

    这个问题在这里已经有答案了 我深入阅读了一些有关委托的内容 令人困惑的是具有一种方法的委托可能与多播委托不同 然而 通过反射 您可以清楚地看到 即使只有一个方法 委托也确实派生自MulticastDelegate 并不是立即地源自于Dele
  • 在java中获取两个日期之间的天数[重复]

    这个问题在这里已经有答案了 您好 有两个日期格式的日期 如何获得两者之间的天数差异 Date date1 Date date2 int numberDays 建议使用 JodaTime API 来处理日期 import java util
  • 跳过 Laravel 的 FormRequest 验证

    我最近添加了已被攻击 https github com valorin pwned validator到我的表单请求类来检查破解的密码 鉴于这会进行外部 API 调用 有没有办法让我在测试期间完全跳过此验证规则或 FormRequest 类
  • catch 和finally 中抛出异常。 CLR 行为与 try-catch 块[重复]

    这个问题在这里已经有答案了 我编写了简单的 C 控制台应用程序 class Mystery static void Main string args MakeMess private static void MakeMess try Sys
  • 自定义地图类型:重复地图和标记。如何向地图添加填充?

    使用 Google Maps API v3 我为虚构的游戏世界创建了自定义地图类型 默认情况下 地图 甚至自定义地图类型 都会水平重复 见下图 Larger Image here https i stack imgur com 6cPuZ
  • 当有新版本可用时,Android 以编程方式更新应用程序

    在我的应用程序中 我想检查应用程序商店中是否有我的应用程序的任何更新版本 如果有的话 那么必须通过警报消息通知用户 如果他 她选择升级 我想更新新版本 我想通过我的应用程序完成这一切 这可能吗 我有同样的问题 但已通过 JSOUP 库解决
  • 如何让 nginx/gunicorn 使用结构化日志记录?

    我目前看到 172 19 0 1 09 Feb 2018 07 00 32 0000 GET ping HTTP 1 1 200 1 curl 7 47 0 在我的日志中 但我使用像这样的结构化日志记录 https stackoverflo
  • 防止桌子缠绕

    当表格位于外部表格单元格内部时 如何防止表格换行 看看我的问题底部的简化示例 我的 aspx tablerow tr td align left valign top br td tr
  • 使用 DropzoneJS 时获取文件内容

    我真的很喜欢 DropZoneJS 组件 目前正在将它包装在 EmberJS 组件中 您可以看到演示在这里 https ember cli dropzonejs firebaseapp com 无论如何 包装器工作得很好 但我想监听 Dro
  • `raise "foo"` 和 `raise Exception.new("foo")` 有什么区别?

    两者之间有什么区别 技术 哲学 概念或其他方面 raise foo and raise Exception new foo 从技术上讲 第一个会引发 RuntimeError 消息设置为 foo 第二个引发异常 消息设置为 foo 实际上