首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP异常真的比错误更有用吗?(Adv)

PHP异常真的比错误更有用吗?(Adv)
EN

Stack Overflow用户
提问于 2009-10-26 17:26:07
回答 4查看 871关注 0票数 1

我认为,在正确编码的系统中,错误(作为错误或异常)是不可能的(除了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语言做此操作),那么浪费额外的代码和内存并实现异常的目的是什么?我们只是盲目地这样做,是因为它是对象形式上的错误,还是应用程序设计中的实际好处,而普通的错误并不能给我们带来好处?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-26 18:15:33

我认为错误和例外的定义在哲学上是有区别的。

简单地说,错误是由代码中的逻辑谬误生成的程序缺陷。传递strlen() --一个不正确的参数数--自然是一个错误。另一方面,一个异常处理所有东西都被正确编程的情况,但是您的代码正在与代码库之外的资源(文件系统、web服务、外部可执行文件等)交互。虽然这些外部资源应该在每个调用上都能很好地工作,但是也会有一些情况--超出程序控制范围--并不归因于代码的错误(文件系统被卸载,连接超时等等)。由于这些问题是由外部因素造成的,因此被视为例外。

主要的区别是错误发生在自己的代码中,而异常发生在第三方资源中的异常情况下。

票数 3
EN

Stack Overflow用户

发布于 2009-10-26 17:30:27

这句话之后我就停止阅读了:

我认为,在正确编码的系统中,错误(作为错误或异常)是不可能的(除了DB/memcached服务器停机,导致查询失败)。

这是异常的整体用途 --作为代码中管理异常情况的构造。

如果您将异常作为_un_exceptional普通程序流的一部分抛出,那么您正在做一些错误的事情。

如果您不知道为什么异常对于特殊情况是有用的,那么也许您需要花一些时间使用真正的OO语言。(提示: PHP不是真正的OO语言。)

票数 7
EN

Stack Overflow用户

发布于 2009-10-26 17:33:32

除了所有这些错误的面向对象方法之外,扩展异常还具有很大的优势。

因此,您可以捕获IOExceptions在一个catch块中的所有子异常(例如,在一个catch块中),以及在另一个catch块中捕获所有其他异常,在那里您可能再次抛出该异常:

代码语言:javascript
运行
复制
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块时,错误处理看起来几乎总是相似的,而且在许多情况下比使用代码等的正常错误更容易解释。

你能更好地理解哪一个:?

代码语言:javascript
运行
复制
switch($errorCode)
{
    case 1450:
        // Create the database column
        break;
}

// or

catch(ColumnNotFoundException $e)
{
    // Create the database column
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1626119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档