我认为,在正确编码的系统中,错误(作为错误或异常)是不可能的(除了DB/memcached服务器停机,导致查询失败)。我们的代码不应该依赖于任何假设才能正常工作,并且应该尽可能地防弹。
然而,为了确保我们的系统以最友好的方式处理问题,我们必须建立和实现某种“捕获系统”,以确保一旦出现任何错误,我们的服务器人员和最终用户都将得到照顾。
为此,PHP提供了两种解决方案--错误和异常。错误由5个值组成,而异常由包装在一个对象中的5个值组成。两者都允许回溯,这是宝贵的,而应用程序正在建设。
这5个值是$error_code,$error_message,$file,$line,$context
通常,在我们为正确的OOP编程而奋斗的过程中,默认的选择总是追求对象--但在这种情况下,我不确定它们到底有多大的益处。通过使用异常,会浪费额外的内存来满足将值包装到对象中的需要(这通常还需要包含异常类的额外文件)。此外,还必须包装您认为在TRY / CATCH {}块中可能失败的任何代码。这使得错误处理方法对人为错误开放,因为开发人员可能不涵盖故障点。为了安全防范这一点,您可以使用set_exception_handler,它将被传递任何未捕获的异常。异常处理程序的坏处在于,在调用exception_handler之后,执行将停止--因此,如果未在try / catch块中捕获可恢复/忽略的异常,则不存在可恢复/忽略的异常。
另一方面,错误总是全局的,可以由set_error_handler设置的任何函数/类来处理。这样就不需要额外的异常类、对象内存或行try / catch代码。与异常一样,错误也带有内置错误代码(与异常不同),您可以使用这些代码继续执行脚本,以解决次要或不重要的脚本问题。此外,大多数PHP函数都会触发错误,因此不会违背语言流。
因此,假设您无论如何都必须支持错误处理(对PHP语言做此操作),那么浪费额外的代码和内存并实现异常的目的是什么?我们只是盲目地这样做,是因为它是对象形式上的错误,还是应用程序设计中的实际好处,而普通的错误并不能给我们带来好处?
发布于 2009-10-26 10:15:33
我认为错误和例外的定义在哲学上是有区别的。
简单地说,错误是由代码中的逻辑谬误生成的程序缺陷。传递strlen() --一个不正确的参数数--自然是一个错误。另一方面,一个异常处理所有东西都被正确编程的情况,但是您的代码正在与代码库之外的资源(文件系统、web服务、外部可执行文件等)交互。虽然这些外部资源应该在每个调用上都能很好地工作,但是也会有一些情况--超出程序控制范围--并不归因于代码的错误(文件系统被卸载,连接超时等等)。由于这些问题是由外部因素造成的,因此被视为例外。
主要的区别是错误发生在自己的代码中,而异常发生在第三方资源中的异常情况下。
发布于 2009-10-26 09:30:27
这句话之后我就停止阅读了:
我认为,在正确编码的系统中,错误(作为错误或异常)是不可能的(除了DB/memcached服务器停机,导致查询失败)。
这是异常的整体用途 --作为代码中管理异常情况的构造。
如果您将异常作为_un_exceptional普通程序流的一部分抛出,那么您正在做一些错误的事情。
如果您不知道为什么异常对于特殊情况是有用的,那么也许您需要花一些时间使用真正的OO语言。(提示: PHP不是真正的OO语言。)
发布于 2009-10-26 09:33:32
除了所有这些错误的面向对象方法之外,扩展异常还具有很大的优势。
因此,您可以捕获IOExceptions在一个catch块中的所有子异常(例如,在一个catch块中),以及在另一个catch块中捕获所有其他异常,在那里您可能再次抛出该异常:
try
{
// [...] (some code causing the exception)
}
catch(IOException $e)
{
// do your processing here, like let's say set correct filemodes.
}
catch(Exception $e)
{
// catches all other exceptions
}
此外,它们还为您提供了一种更标准化的处理脚本中错误的方法。当您使用try/catch块时,错误处理看起来几乎总是相似的,而且在许多情况下比使用代码等的正常错误更容易解释。
你能更好地理解哪一个:?
switch($errorCode)
{
case 1450:
// Create the database column
break;
}
// or
catch(ColumnNotFoundException $e)
{
// Create the database column
}
https://stackoverflow.com/questions/1626119
复制相似问题