首页 / 知识
关于php:在PHP5中,我应该使用Exceptions还是trigger_error / set_error_handler?
2023-04-15 05:21:00

In PHP5, should I use Exceptions or trigger_error/set_error_handler?两种方式的利弊是什么? 有没有正确的方法?
如果要在整个应用程序中使用异常而不是错误,则可以使用ErrorException和自定义错误处理程序来实现(有关示例错误处理程序,请参见ErrorException页面)。此方法的唯一缺点是非致命错误仍会引发异常,除非捕获异常,否则异常总是致命的。基本上,如果您的error_reporting设置不禁止它们,甚至 我认为使用ErrorException有几个好处:
您可以使用
如果要在发生任何未捕获的错误时向用户显示友好消息,可以将整个脚本包装在单个 您应该在"特殊情况"下使用异常,也就是说,当您调用方法doFoo()时,您应该期望它执行,如果由于某种原因doFoo无法执行其工作,则应引发异常。 许多旧的php代码都会采用在发生故障时返回false或null的方法,但这使事情难以调试,异常使此调试更加容易。 例如,假设您有一个名为getDogFood()的方法,该方法返回了DogFood对象的数组,如果您调用此方法,并且在出现问题时返回null,那么调用代码将如何判断是否由于错误而返回了null还是没有狗粮? 关于使用php的内置错误日志记录的遗留代码库,您可以使用set_error_handler()函数覆盖错误日志记录,该函数可用于随后抛出通用Exception。 既然您已拥有所有引发详细异常的代码,则可以自由决定如何处理它们,在代码的某些部分中,您可能希望捕获它们并尝试其他方法,或者可以使用自己的日志记录功能对其进行记录可能会登录到数据库,文件或电子邮件-随便哪个。简而言之,例外更为灵活。 我喜欢使用异常的想法,但是我经常会涉及第三方库,然后,如果他们不使用异常,您最终会使用3-4种解决问题的方法! Zend使用异常。 CakePHP使用自定义错误处理程序,大多数PEAR库使用PEAR :: Error对象。 我在这方面有一个正确的方法。在这种情况下,自定义错误处理程序路由可能是最灵活的。但是,如果仅使用自己的代码或使用使用它们的库,则异常是一个好主意。 不幸的是,在PHP世界中,我们仍然遭受着死于PHP4的苦难,因此异常之类的东西虽然代表了最佳实践,但是在所有人都仍在编写能够同时在这两者中工作的东西的过程中,进展却异常缓慢。4和5.希望这场崩溃现在可以结束了,尽管到那时,我们将在6到5之间紧张起来... /我握着头... 介绍 根据我的个人经验,通常,我更喜欢在代码中使用Exception而不是trigger_error。这主要是因为使用异常比触发错误更灵活。而且,恕我直言,这不仅对我自己还是对第三方开发人员都是有益的。 而且我可以做所有这一切,而不必强加他应该如何处理我的库故障。 (即:创建复杂的错误处理功能)。他可以使用try catch块,也可以只使用通用异常处理程序 注意: 从本质上讲,这些要点中的某些点对于trigger_error也有效,实现起来稍微复杂一点。尝试catch块确实非常易于使用,并且对代码非常友好。 例 我认为这是一个例子,可以说明我的观点:
说明
在构造函数中,如果传递的参数不是
(注意:我可以简单地写
在
处理示例库 这是一个如何处理这个组成的库的示例:
您可以进一步进行并嵌套尝试捕获块,链异常,按照确定的异常链路径运行选择性代码,选择性日志记录等。 附带说明一下,使用Exceptions并不意味着PROGRAM的执行将停止,而只是意味着将绕过依赖于我的对象的代码。由我或第三方开发人员自行决定。 显然,没有"正确的方法",但是对此有很多意见。 ;) 就个人而言,我将trigger_error用于异常无法完成的事情,即通知和警告(即您要记录的内容,但不能以与错误/异常相同的方式停止应用程序的流(即使您在某种程度上捕获了它们) ))。 我还通常将异常用于假定是不可恢复的条件(发生异常的方法的调用方),即严重错误。我不使用异常来替代返回具有相同含义的值的方式,如果可以通过非卷积方式实现的话。例如,如果创建一个查找方法,则通常会在没有找到要查找的内容时返回空值,而不是抛出EntityNotFoundException(或等效项)。 所以我的经验法则是这样的:
在后一种情况下引发异常的原因(与触发错误相反)是,假设您使用正确命名的Exception子类,则异常的表达性更高。我发现在决定使用哪种异常时,使用PHP标准库的异常是一个很好的起点:http://www.php.net/~helly/php/ext/spl/classException.html 但是,您可能需要扩展它们以获取针对您的特定情况的更多语义正确的异常。 这取决于实际情况。当我编写业务逻辑/应用程序内部时,我倾向于使用Exceptions,而对于Validator和类似的东西,则使用trigger_error。 在逻辑级别使用Exceptions的优点是允许您的应用程序在发生此类错误的情况下执行此操作。您允许应用程序选择而不是让业务逻辑知道如何显示错误。 比如说,使用Trigger_error作为Validator的专业人士以及具有这种性质的事物,
其中my_login_form_handler修饰字符串并将元素放置在登录表单上方的可见区域中。 异常的想法很优雅,并且使错误处理过程非常顺利。但这仅在您具有适当的异常类并且在团队开发中适用时,更重要的是"标准"异常。因此,如果您打算使用异常,则最好先对异常类型进行标准化,或者更好的选择是使用一些流行框架中的异常。适用于PHP的另一件事(您可以在其中编写结合结构代码的代码对象定向器)是,如果要使用类编写整个应用程序。如果您正在编写面向对象的代码,那么肯定可以更好地使用异常。毕竟,我认为您的错误处理流程比trigger_error和其他东西要平滑得多。 异常是一种现代且健壮的方式来表示错误情况/异常情况。使用它们 :) 在第三方应用程序集成时代,使用异常并不是一个好主意。 因为,当您尝试将您的应用程序与其他应用程序或其他人的应用程序与您的应用程序集成时,您的整个应用程序将在某个第三方插件中的类抛出异常时停止。即使您具有完整的错误处理功能,也可以在自己的应用程序中实现日志记录,但在第三方插件中某个人的随机对象将抛出异常,并且整个应用程序将在那里停止。 即使您在应用程序中有能力弥补您正在使用的该库的错误,也可以...。 例如,第三方社交登录库可能会抛出异常,因为社交登录提供程序返回了错误,并不必要地杀死了您的整个应用程序-hybridauth。因此,这里有一个完整的应用程序,那里有一个库,为您带来了附加功能-在这种情况下为社交登录-即使在提供商未通过身份验证的情况下有很多后备功能(您自己的)登录系统,再加上20个左右的其他社交登录提供商),您的ENTIRE应用程序将陷入停顿。您最终将不得不更改第三方库来解决这些问题,而使用第三方库来加速开发的意义将丢失。 就PHP处理错误的哲学而言,这是一个严重的设计缺陷。面对现实吧-在当今开发的大多数应用程序的另一端,有一个用户。无论是Intranet用户,是Internet用户,还是sysadmin,都没有关系-通常有一个用户。 而且,让应用程序死在您的脸上,除了回到上一页并对您作为用户试图做的事情一无所知之外,那时您无能为力,这是不好的,开发方面的不良做法。更不用说,由于许多原因(从可用性到安全性),开发人员只能在用户脸上抛出内部错误。 结果,仅出于这个原因,即时消息我就不得不放弃一个特定的第三方库(在这种情况下为hybridauth),而不能在我的应用程序中使用它。尽管hybridauth是一个非常好的库,并且显然已经花了很多心血,但功能很多。 因此,您应该避免在代码中使用异常。即使您现在正在执行的代码是将运行您的应用程序的顶级代码,而不是库,您也可能希望将所有或部分代码包含在其他项目中,或者必须集成部分或与您自己的其他代码或第三方代码一起使用。而且,如果您使用了异常,则最终将面临相同的情况-即使您有适当的方法来处理一段代码所提供的任何问题,整个应用程序/集成也将死在眼前。 |
最新内容
相关内容
linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux命令以服务方式?
linux命令以服务方式?,服务,系统,标准,设备,工作,命令,网络,操作系统,文件,服务器,重启服务器的linux命令Linux重启命令有五个,分别是:shutdownlinux命令输入方法?
linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,linux终端输入~怎么弄中间在电脑上打开需要的Word文件进入。进入到文linux读取命令方式?
linux读取命令方式?,位置,信息,工作,管理,命令,软件,图片,名称,发行,环境,linux中怎么用命令打开文本文件?1、xdg-open:这个命令可以打开任何文Python中什么是反射?使用方法有哪
Python中什么是反射?使用方法有哪些?,信息,培训,状态,术语,检测,反射,属性,对象,字符串,方法,反射这个术语在很多语言中都存在,并且存在大量的Python中有哪些方法可以解压文件?
Python中有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大报名Python培训选择哪种方式比较好
报名Python培训选择哪种方式比较好?,培训,工作,基础,时间,情况,在线,最划算,环境,系统,方式,Python不仅是一种高级的编程语言,而且还是一种应用Python列表类型list合并有哪些方法
Python列表类型list合并有哪些方法?,培训,方法,列表,可能会,数组,切片,下文,字符串,数据类型,请看,在Python编程语言中,有各种数据类型,比如字符Python使用websocket的几种方式
Python使用websocket的几种方式,代码,时间,工作,名字,新兴,网上,培训,感觉,前端,样子,很简单也很强大,前端库因为逻辑不需要更改,所以感觉挺好零基础学习Python的四种方法
零基础学习Python的四种方法,基础,代码,基础知识,培训,发展,时间,知识,书籍,初学者,练习,近年来,随着移动互联网的发展,对Python人才的需求越来Python语言支持编程方式有哪些
Python语言支持编程方式有哪些,数据,设计,中心,代码,第三,网站,人工智能,平台,位置,培训,Python是一种跨平台的计算机程序设计语言,是一个高层如何在Python中定义类方法和修改类
如何在Python中定义类方法和修改类属性?,代码,方法,培训,对象,实例,定义,结果,示例,赋值,属性,Python中的类还可定义使用@classmethod修饰的类