有没有替代方案来抢救Ruby的LoadError?

And*_*imm 9 ruby exception require

我阅读了博客文章JRuby Performance:Exceptions不是流量控制,它主张避免使用Exceptions,除非是特殊情况.

我意识到我犯了使用救援来定期处理LoadErrors的罪行.

是否有替代require尝试加载文件(如果存在),但如果不存在则不会抛出异常?

背景:如果你想知道"你为什么要求你不要求?",这是我的故事:

  1. 当我为Ruby 1.8编程时,我使用了require "rdoc/usage"如果我没有在命令行应用程序中输入正确数量的参数,我可以提供使用信息.这会在开箱即用的1.9上引发异常.
  2. 我的应用程序的一部分涉及在Windows桌面上运行时操作win32ole的代码.如果涉及的文件是在执行繁重计算工作的Linux服务器下运行,则会导致LoadError.使用win32ole的文件还有其他在我的测试套件中测试的代码,因此在Linux下运行我的测试套件时,我必须要求这些文件.我应该拆分这些文件,但这看起来有点像牦牛剃须.

Ale*_*x D 7

计算机程序几乎把所有时间花在循环中.如果您在内循环中反复引发和抢救异常(在程序执行期间执行了数百万次),则可能确实存在性能问题.但是加载文件通常只在程序初始化期间完成.如果你在程序启动期间提出并解决一些例外情况,那么对任何人都会注意到对性能的影响将太接近于零.

顺便说一句,如果你有一个真正对性能敏感的方法(即多次执行),但你确实需要一个"goto",它允许你跳出多个块甚至向上调用堆栈(如异常) ),使用throwcatch.他们是相似raiserescue,但速度要快得多.引发异常的大部分性能成本来自填充堆栈跟踪,而throw不是这样做.

恕我直言,begin; require "..."; rescue LoadError是惯用的Ruby,不管人们怎么说"使用流量控制的例外",都不能被认为是一种不好的做法.如果您的脚本通常在Windows上执行,那么在Linux上运行可能会被视为"异常情况",并且值得使用异常.一般来说,如果你想要加载的文件不在那里,那就是"例外条件" - 这就是为什么首先require引发异常的原因!

高举你的头,伙计!不要让仇敌让你对使用简单的常识代码感到内疚!


mu *_*ort 2

require对第一个案例使用异常可能很好,并且比在调用它之前尝试弄清楚是否会失败要简单得多。如果您所做的只是尝试加载一些可选的东西(或者,类似地,您需要支持几个执行相同操作的不同库),那么尝试加载它并处理异常是很好的、良好的、道德上正直的行为。

在第二种情况下,在尝试执行 OLE 等特定于平台的操作之前检查RUBY_PLATFORMsys-uname可能更有意义。有时牦牛确实需要剃毛。在这种情况下,如果您使用的是 Windows,那么您确实希望 require 失败,而如果您使用的是 Linux,则根本不想 require;您正在使用异常的副作用而不是异常本身。

有时,人们尝试使用异常作为某种可捕获的 goto。异常适用于不可恢复的错误情况,而不是作为一般事件通知系统。使用异常作为 goto(即流量控制)是对异常处理系统的滥用,构建使用异常进行流量控制的系统的人通常最终会进医院(因为“跌落”到一箱锤子里,十次)一排)。