And*_*imm 9 ruby exception require
我阅读了博客文章JRuby Performance:Exceptions不是流量控制,它主张避免使用Exceptions,除非是特殊情况.
我意识到我犯了使用救援来定期处理LoadErrors的罪行.
是否有替代require尝试加载文件(如果存在),但如果不存在则不会抛出异常?
背景:如果你想知道"你为什么要求你不要求?",这是我的故事:
require "rdoc/usage"如果我没有在命令行应用程序中输入正确数量的参数,我可以提供使用信息.这会在开箱即用的1.9上引发异常.计算机程序几乎把所有时间花在循环中.如果您在内循环中反复引发和抢救异常(在程序执行期间执行了数百万次),则可能确实存在性能问题.但是加载文件通常只在程序初始化期间完成.如果你在程序启动期间提出并解决一些例外情况,那么对任何人都会注意到对性能的影响将太接近于零.
顺便说一句,如果你有一个真正对性能敏感的方法(即多次执行),但你确实需要一个"goto",它允许你跳出多个块甚至向上调用堆栈(如异常) ),使用throw和catch.他们是相似raise和rescue,但速度要快得多.引发异常的大部分性能成本来自填充堆栈跟踪,而throw不是这样做.
恕我直言,begin; require "..."; rescue LoadError是惯用的Ruby,不管人们怎么说"使用流量控制的例外",都不能被认为是一种不好的做法.如果您的脚本通常在Windows上执行,那么在Linux上运行可能会被视为"异常情况",并且值得使用异常.一般来说,如果你想要加载的文件不在那里,那就是"例外条件" - 这就是为什么首先require引发异常的原因!
高举你的头,伙计!不要让仇敌让你对使用简单的常识代码感到内疚!
require对第一个案例使用异常可能很好,并且比在调用它之前尝试弄清楚是否会失败要简单得多。如果您所做的只是尝试加载一些可选的东西(或者,类似地,您需要支持几个执行相同操作的不同库),那么尝试加载它并处理异常是很好的、良好的、道德上正直的行为。
在第二种情况下,在尝试执行 OLE 等特定于平台的操作之前检查RUBY_PLATFORM或sys-uname可能更有意义。有时牦牛确实需要剃毛。在这种情况下,如果您使用的是 Windows,那么您确实希望 require 失败,而如果您使用的是 Linux,则根本不想 require;您正在使用异常的副作用而不是异常本身。
有时,人们尝试使用异常作为某种可捕获的 goto。异常适用于不可恢复的错误情况,而不是作为一般事件通知系统。使用异常作为 goto(即流量控制)是对异常处理系统的滥用,构建使用异常进行流量控制的系统的人通常最终会进医院(因为“跌落”到一箱锤子里,十次)一排)。
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |