php - PHP异常真的比错误有用吗? (进阶)

标签 php exception-handling error-handling

我相信在正确编码的系统中-错误(作为错误或异常)应该是不可能的(DB/memcached服务器故障导致查询失败)。我们的代码不应依赖任何假设才能正常工作,并且应尽可能地证明其正确性。

但是,为了确保我们的系统以最用户友好的方式处理问题,我们必须构建并实现某种“捕获系统”以确保万一发生问题,我们的服务器人员和最终用户都将被照顾。

为此,PHP提供了两种解决方案-错误和异常。错误包含5个值,而异常包含5个包装在对象中的值。两者都允许回溯,这在构建应用程序时非常宝贵。

The 5 values are $error_code, $error_message, $file, $line, $context



通常,在我们努力进行适当的OOP编程时,默认选择始终是追求对象-但是在这种情况下,我不确定它们的真正好处。通过使用异常,多余的内存浪费了将值包装在对象中的需要(这通常还需要包含异常类的额外文件)。此外,您必须将您可能会失败的所有代码包装在TRY/CATCH {}块中。由于开发人员可能无法涵盖故障点,因此错误处理方法容易受到人为错误的影响。为了防止这种情况的发生,您可以使用set_exception_handler,它将传递任何未捕获的异常。异常处理程序的坏处在于,执行将在调用exception_handler之后停止-因此,如果不将其捕获在try/catch块中,则不会发生可恢复/忽略的异常。

另一方面,错误始终是全局错误,可以由set_error_handler设置的任何函数/类来处理。这样就不需要额外的异常类,对象内存或try/catch代码行。像异常一样,错误也随内置的错误代码一起提供(不同于异常),您可以使用这些代码继续执行脚本,以解决较小或不重要的脚本问题。此外,大多数PHP函数都会触发错误,因此您不会违反该语言的流程。

因此,既然您必须始终支持错误处理(使用PHP语言),那么浪费额外的代码和内存来实现异常的目的是什么?我们是否只是盲目地这样做,是因为它是对象形式的错误,还是在应用程序设计中真正的好处是普通错误不会给我们带来负担?

最佳答案

我相信错误和异常(exception)的定义在哲学上是有区别的。

简单地说,错误是由代码中的逻辑谬误产生的编程缺陷。传递strlen()不正确数量的参数自然应该是一个错误。另一方面,异常处理的是所有内容均已正确编程,但您的代码正在与代码库之外的资源(文件系统,Web服务,外部可执行文件等)交互的情况。预计此类外部资源应在每次调用时都能正常工作,但在某些情况下-超出了程序的控制范围-并非归因于代码错误(文件系统被卸载,连接超时等) 。由于这些问题是由于外部因素引起的,因此被视为异常(exception)。

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

关于php - PHP异常真的比错误有用吗? (进阶),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1626119/

相关文章:

php - 在 Joomla 中添加来自 MySQL 的开放图数据

php 编辑/添加新内容使用数据库中的 POST/GET 进行混淆

c# - 让异常冒泡

asp.net - 减少ELMAH记录的错误详细信息

python - DOCPLEX:添加一个对两个变量求和的约束

php - 从逗号分隔值搜索

php - 我无法在使用 angularjs 时使用 php 设置文本框的默认值

javascript - 在 javascript 中解释自定义 Error 对象并与之交互

logging - 如何在 Apigility ZF2 应用程序中捕获和记录所有异常?

java - 在构建字符串并将它们添加到 ArrayList 时出错