er Interface, 用在组件内部的异常既能继承 SPL 的异常类型, 也能在运行时被各种代码捕捉.?我们来看下列代码:
// usage of bracket syntax for brevity
namespace MyCompany\Component {
?
? ? interface Exception
? ? {}
?
? ? class UnexpectedValueException
? ? ? ? extends \UnexpectedValueException
? ? ? ? implements Exception
? ? {}
?
? ? class Component
? ? {
? ? ? ? public static function doSomething()
? ? ? ? {
? ? ? ? ? ? if ($somethingExceptionalHappens) {
? ? ? ? ? ? ? ? throw new UnexpectedValueException('Something bad happened');
? ? ? ? ? ? }
? ? ? ? }
? ? }
?
}
如果调用上面代码中的?MyCompany\Component\Component::doSomething() 函数, doSomething() 抛出的异常可以当作下列异常类型捕捉:?PHP?的?Exception, SPL 的?UnexpectedValueException, SPL 的?RuntimeException,?该组件的MyCompany\Component\UnexpectedValueException,?或该组件的 MyCompany\Component\Exception. 这为捕捉你的类库组件中的异常提供了极大的便利.?此外, 通过分析异常的类型, 我们也能看出某个异常的含义.?
总结
总而言之,本文旨在教大家, 创建和抛出异常的最佳标准做法, 即: 应该多关注异常的类型, 少纠结异常的错误消息。如果你有什么看法, 欢迎在这里留言, 或在 PHP 文档网页, 亦或是上面给出链接的ZF2 wiki 留言。
?