大约7年前,我们最初开始开发ZendFramework的第2版时,我们就开创了ZendFramework的异常处理模式。模式看起来像这样:
- 我们将为每个包创建一个标记
ExceptionInterface
。 - 我们将扩展SPL异常并在这样做时实现包标记接口。
这让用户能够通过三种方式捕捉:
- 他们可以通过类名捕获最具体的异常类型。
- 他们可以使用标记接口捕获所有包级异常。
- 可以捕获一般异常使用关联的SPL类型。
举个例子:
try { $do->something(); } catch (MostSpecificException $e) { } catch (PackageLevelExceptionInterface $e) { } catch (\RuntimeException $e) { }
这种粒度非常好用。非常好,PHP-FIG制定的一些标准现在提供了它们,例如PSR-11,它提供了一个ContainerExceptionInterface
和一个NotFoundExceptionInterface
。
我们最近开始做的一件事是让包只支持PHP7版本,让标记
ExceptionInterface
扩展Throwable
接口;这确保了实现必须能够被抛出!
我们最近开始做的一件事是让包只支持PHP7版本,让标记
ExceptionInterface
扩展Throwable
接口;这确保了实现必须能够被抛出!
那么,当您正在编写一个预期会抛出与这些接口之一匹配的异常的一次性实现时会发生什么?
为什么,当然是使用匿名类!
例如,我今天正在编写一些说明自定义ContainerInterface
实现的文档,并意识到我需要在某一时刻抛出异常,特别是Psr\Container\NotFoundExceptionInterface
.我写了以下片段:
$message = sprintf(/* ... */); throw new class($message) extends RuntimeException implements NotFoundExceptionInterface { };
完成!
这是有效的,因为RuntimeException
将消息作为第一个构造函数参数;通过扩展该课程,我获得了这种行为。由于NotFoundExceptionInterface
是一个标记接口,我不需要添加任何额外的行为,所以这个内联示例开箱即用。
您还使用匿名类做什么?