【发布时间】:2012-12-05 22:10:48
【问题描述】:
我们有一个正在使用的标准,我们在主类中创建异常以返回错误等...问题是,所有标准嗅探都不喜欢这样。我们正在为此编写自己的嗅探器,但我想我会问为什么这是不可取的?
例如,我们有:
<?php
class FOO_EXCEPTION extends Exception { }
class FOO_EXCEPTION_BAR extends FOO_EXCEPTION { }
class FOO_EXCEPTION_POLE extends FOO_EXCEPTION { }
class FOO
{
public function MethodDoingSomething()
{
if('some condition happens') {
throw new FOO_EXCEPTION_BAR();
}
if('some other condition') {
throw new FOO_EXCEPTION_POLE();
}
...
}
}
?>
这允许我们的代码返回不同的异常来指示调用者发生了什么,但是如果专用的 try/catch 不可用,那么基本的 Exception 仍然可能被捕获。
这在处理数据库或其他外部对象时会派上用场,因为错误的性质可能会返回到调用堆栈更高的组件来处理错误。
例如,如果您正在删除一个文件,而该文件不存在,则代码可能会抛出异常,但调用者可以选择忽略此异常,如果它不担心该文件不存在,因为它无论如何都试图删除它。但是,另一个调用者可能会因缺少删除时假定存在的文件而出错。
【问题讨论】:
-
如果您使用自动加载器,那么您不需要将异常类放在同一个文件中;每个都可以位于自己的单独文件中,并且在实际引用之前不需要加载(使用 PHP 内存)
-
没错,但我们将它们放在一起是出于逻辑原因,即它们在文件中定义并且对于每个开发人员都清晰可见,并且知道可以抛出什么。另一个问题是,如上所示,通常异常只不过是要捕获的定义,因此在可以通过自动加载加载的外部文件中创建它似乎也有点过头了。
-
这就是一个很好的简单文件夹结构有帮助的地方:您的类文件夹中有 Foo 类文件;然后是您拥有 Foo_Exception 类文件的 Foo 文件夹;和一个 Exception 子文件夹,在你有 Foo_Exception_Bar 和 Foo_Exception_Pole 类文件的地方......同样合乎逻辑,而且很容易阅读
-
我知道你要去哪里。这将非常简单,尽管有很多目录和非常短的文件。我最关心的是确保我们所有的开发人员都遵循这一点并意识到创建了哪些异常。我猜这种格式也适用于 PHP 5.3 的命名空间结构。
-
是很多目录和短文件;但是如果您使用的是自动加载器和 APC,这不会对性能产生任何不利影响(相反,它通常会好很多,因为只有实际需要的内容才会包含在内存中,并且没有加载的开销不需要的其他包括)。切换到这样的结构的最大问题是开发人员对结构的理解;但它应该相当直观
标签: php exception codesniffer