php5.3 异常机制新的实践

异常机制 php5.3最好的实践
 
异常机制不是php的新特性,我们将研究php5.3的2个异常特性
1.是嵌套异常2.SPL扩展中的新异常类型。
 
背景资料
 
此前在PHP5.2中,有一个单一的异常类。通常,异常类Zend框架/ PEAR编码标准的角度来说,
这成为从您的类库中将可能抛出的异常的根源。例如,如果您创建了一个库为MyCompany的类,
那么你会根据ZF/ PEAR标准,有前缀的所有代码与MyCompany_。对于这个类库,你可能会创建库代码例外:
MyCompany_Exception,扩展PHP类的异常和所有组件可能继承子类,并抛出异常。因此,如果您创建组件
MyCompany_Foo的,它可能有一个基础异常类称为MyCompany_Foo_Exception,预计将抛出内MyCompany_Foo
组件。这些异常可以被捕获,试图赶上MyCompany_Foo_Exception,MyCompany_Exception,或者干脆例外处理。
这将使3个级别的粒度(或更多取决于多少次MyCompany_Foo_Exception子类),给消费者在这个特殊的库这个组件
,并在他们认为合适的方式处理该异常。
 
嵌套异常
 
在PHP5.3中,现在的基异常类处理嵌套。嵌套是什么?嵌套是一个特定的异常捕捉能力,创建一个新的一个引用原始异常
被抛出的异常对象。这就允许调用者访问内所消耗的比较知名的类型库抛出的异常,但也获得异常起源以及这种特殊的行为。
这是为什么有用吗?通常情况下,这是最有用的代码,消耗其自身类型的抛出异常的其他代码。这可能是适配器模式的代码,
利用包裹第三方代码提供某种适应性的功能,或者干脆利用一些异常抛出PHP扩展的代码。
例如,在组件Zend_Db的,它使用适配器模式来包装具体的PHP扩展,以创建一个数据库抽象层。在一个适配器,Zend_Db的包装PDO,
PDO会抛出自己的异常PDOException的,Zend_Db的,需要赶上这些PDO具体的例外,并重新抛出他们的预期和已知类型
Zend_Db_Exception。这为开发人员提供了保证Zend_Db的总是会抛出异常的类型Zend_Db_Exception(所以它可以被捕获),
但他们也将有机会被抛出的情况下,它需要到原来的PDOException。
 
 
新的异常类型
 
此外,在PHP 5.3的开发中,我们都闪耀着一些新的和有趣的异常类型的一盏灯。这些例外一直以来,PHP情况5.2.x,但直到最近一直
没有和“重新评估”异常的最佳做法,他们现在获得了一些风头。他们在SPL扩展和实施上列出的手册页设在这里。由于这些新的异常
类型是PHP核心的一部分,SPL的一部分,它们可以用于任何针对PHP 5.3的最低运行他们的代码。虽然这看起来不太重要的编写应用
层代码时,我们采取的方式,并使用这些新的异常类型变得更加重要,当我们正在写库代码和消费。
那么,为什么新的异常类型一般?此前,开发商把更多的信息,进入异常消息,试图给更多的含义及其例外。虽然这是件好事,
它有一些缺点。一个是你不能赶上一个基于消息的异常。这可能是一个问题,如果你知道一组代码抛出同样的异常类型,各种消息
各种特殊的条件,可以进行不同的处理。例如,验证类在$权威性 - >身份验证();它抛出相同的异常类型(我们的假设例外),
但不同的消息2具体的故障:一个失败的地方认证服务器可以不被达到和同一认证尝试失败的异常类型,但不同的消息。在这种情况
下(请不要介意,使用异常未必是最好的方式来处理身份验证响应),那就需要解析消息的字符串以不同的方式处理这两种情况。
 
要解决这个编纂异常显然是某种方式,让他们可以很容易地审问时,试图辨别如何应对这种特殊的情况。有第一反应库是使用代码的
异常基类的属性。另一种是建立多种类型,或者新的异常类,可以抛出来形容行为。这两种方法都具有相同的简单的缺点。作为最佳实
践也没有出现,因此,也被认为是一种标准的,因此每个项目都试图复制这种解决方案可能会做小的变化,迫使消费者回去文档以了
解具体的解决方案,创建图书馆。现在新类型的方法在SPL,否则称为标准PHP库;开发人员可以利用这些新的类型以同样的方式在自己
的项目,并已成为他们消耗的项目,因为这些新类型的最佳实践。
 
详细的消息的方法的第二个缺点是,它使得为母语非英语或有限的英语开发商更难理解的特殊情况。这可能会降低一些开发商当试图
破译异常消息试图传达。由于许多开发商那里写的例外,也有同样多的变化,他们将如何描述这种情况的消息中,因为没有标准的符合性或编纂。
让我怎么使用他们,给我的肮脏细节?总共有13个新的例外在SPL。他们两个可以被认为是“基地”的类型:LogicException和RuntimeException
的延长PHP异常类。的其余部分的方法正是如此可以被分解成三个逻辑组:动态呼叫组,逻辑组和运行组。
动态调用组包含的的例外BadFunctionCallException和BadMethodCallException的。 BadMethodCallException是一个子类
BadFunctionCallException这又是一个子类LogicException的。也就是说,这些异常可以通过其直接型,LogicException,或者干脆异常
捕获。你什么时候使用?一般来说,这些特殊情况时,应使用产生无法解决的__通话()在方法或回调时无法找到一个有效的函数调用
(或更好说,自己是不是is_callable时())的结果。
 
 

转载请注明本文链接:http://www.simapple.com/218.html