可悲的是,我有一个遗留的PHP4系统,我不断需要添加功能。如果不是几年,看起来好像有资源可以在几个月内完成到PHP5的端口。在过去几年中,困扰我的一件大事是没有能力干净地抛出异常。因此,各种错误检查代码必须不断地中断正在发生的事情。
接下来的问题:在没有异常模型的语言中,您所看到的最佳策略是什么才能模拟异常处理的清洁度?
Joel在答案中指出了有关例外情况的说法:
http://www.joelonsoftware.com/items/2003/10/13.html
它们为函数创建了太多可能的退出点。要编写正确的代码,您必须考虑通过函数的每个可能的代码路径。每次调用一个可以引发异常并且不能在现场捕获异常的函数时,就会为突然终止的函数,数据处于不一致状态或其他代码路径导致的意外错误创造机会。想想。
更好的选择是让您的函数在出现问题时返回错误值,并明确地处理这些错误值,无论它有多么冗长。确实,当你进行良好的错误检查时,应该是一个简单的3行程序通常会开到48行,但这就是生命,并且用异常来描述它并不会使你的程序更加健壮。我认为C / C ++ / Java风格语言的程序员被异常所吸引的原因很简单,因为语法没有简洁的方法来调用返回多个值的函数,因此很难编写一个产生返回值的函数值或返回错误。
但是,语言中的一个好的异常模型会使被调用的函数指定它实际上会抛出异常。这意味着函数退出的位置几乎为零(代码只返回false而不是抛出异常),但是函数有一个额外的位置可以退出...调用功能。任何人都可以编写草率的代码,将所有异常向上传递给其他人处理,但这并不意味着你应该带走一个可以干净利落地使用的工具
实际上,任何函数都可以从调用代码返回超出预期返回值范围的值。一个优秀的程序员将处理所有可能的返回值,包括错误代码和条件。异常模型只是让他有办法干净利落地完成它。
答案 0 :(得分:3)
首先,有些人认为异常不是正确的错误模型,包括one of the founders of this site。
其次,是尝试清点您的次要版本的PHP可用的错误处理函数。我的立即反应是建议花时间编写一个好的错误处理程序,并register it。
然后,在您通常会抛出异常的应用程序执行中,您可以改为trigger errors。如果幸运的话,您可以使用debug_backtrace()。
祝你好运!答案 1 :(得分:2)
Continuation passing style。事实上,我冒昧地说它在“漂亮”方面胜过例外。这不适合PHP,但你可以使用访问者等对象和模式来做到这一点。
但实际上,从PHP4升级到PHP5不需要超过几个小时的工作 - 它主要是向后兼容的。