有没有其他方法可以拯救Ruby的LoadError?

有没有其他方法可以拯救Ruby的LoadError?,ruby,exception,require,Ruby,Exception,Require,我读了一篇博文,其中提倡避免使用异常,除非是特殊情况 我意识到我对使用rescue定期处理加载错误感到内疚 除了require之外,是否还有其他方法可以尝试加载文件(如果文件存在),但如果文件不存在,则不会引发异常 背景:如果你想知道“为什么你有不完全需要的需求?”,下面是我的故事: 在为Ruby 1.8编程时,我使用了require“rdoc/usage”,以便在命令行应用程序中未输入正确数量的参数时提供使用信息。这会在开箱即用1.9上引发异常 我的部分应用程序包含在Windows桌面上运行w

我读了一篇博文,其中提倡避免使用异常,除非是特殊情况

我意识到我对使用rescue定期处理加载错误感到内疚

除了
require
之外,是否还有其他方法可以尝试加载文件(如果文件存在),但如果文件不存在,则不会引发异常

背景:如果你想知道“为什么你有不完全需要的需求?”,下面是我的故事:

  • 在为Ruby 1.8编程时,我使用了
    require“rdoc/usage”
    ,以便在命令行应用程序中未输入正确数量的参数时提供使用信息。这会在开箱即用1.9上引发异常
  • 我的部分应用程序包含在Windows桌面上运行win32ole时操作它的代码。如果所涉及的文件在执行繁重计算工作的Linux服务器下运行,则会导致加载错误。使用win32ole的文件还包含在我的测试套件中测试的其他代码,因此在Linux下运行测试套件时,我需要这些文件。我应该把这些文件分开,但这似乎有点像在刮牦牛胡子

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

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


    有时,人们试图使用异常作为某种可捕获的goto。异常适用于不可恢复的错误情况,而不是一般的事件通知系统。使用异常作为goto(即流控制)是对异常处理系统的滥用,而构建使用异常进行流控制的系统的人通常会在医院结束(因为“掉进”一个锤子盒中,连续十次)。

    计算机程序几乎所有的时间都花在循环中。如果您在一个内部循环中反复引发和挽救异常(在程序执行过程中执行了数百万次),那么您可能确实存在性能问题。但加载文件通常只在程序初始化期间完成。如果在程序启动期间引发并挽救一些异常,对性能的影响将非常接近于零,任何人都不会注意到

    顺便说一句,如果您有一个真正对性能敏感的方法(即多次执行),但您确实需要一个“goto”,它允许您跳出多个块甚至调用堆栈(如异常),请使用
    throw
    catch
    。它们类似于
    raise
    rescue
    ,但速度要快得多。引发异常的大部分性能代价来自于填充堆栈跟踪,而
    throw
    不能做到这一点

    IMHO,
    开始;要求“…”;rescue LoadError
    是一种惯用的Ruby,无论人们怎么说“使用异常进行流控制”,它都不会被认为是一种不好的做法。如果您的脚本通常在Windows上执行,那么在Linux上运行可能会被正确地视为“异常情况”,并且值得使用异常。一般来说,如果您想要加载的文件不在那里,这就是“异常情况”——这就是为什么
    require
    首先引发异常的原因


    高举你的头,伙计!不要让仇恨者因为使用简单的常识代码而让你感到内疚

    我有一个非常类似的用例(即:工具中的可选扩展)。我很想知道LoadError是否是唯一的解决方法。请注意,这篇文章讨论的是一种情况,即每个Rails请求都会引发数百个异常,而您讨论的是在整个程序生命周期中引发两个异常。您实际上不会使用RUBY_平台,但我明白你的意思。@Andrew:我没有必要处理跨平台Ruby问题,所以
    Ruby\u平台
    只是一个猜测,因为它在JRuby上有问题,所以更明确的东西(比如sysuname)会是一个更好的主意。