PHP7的异常处理详解

简介: PHP7的异常处理详解

前言

PHP7的改动中,影响比较大的,包括异常处理

概述

更多的异常是直接通过PHP直接处理的,和之前的PHP5不同的是更多的异常是通过Error exceptions来抛出。

作为一个普通的扩展,Error exceptions会持续冒出直到匹配到对应的catch块。如果没有进行匹配,就会触发被设置的set_exception_handler() 来执行处理,如果没有默认的异常处理程序,则该异常将被转换为一个致命错误,并且将被像一个传统的错误被处理。

由于Error在错误层次结构不继承异常,像这样的代码catch (Exception $e) { ... } 在PHP5中并不会捕获到对应的异常。我们可以用代码catch (Error $e) { ... } 或者 set_exception_handler(),来对Error进行处理。

错误的层级结构

  • Throwable
  • Error 错误- ArithmeticError 算数错误- DivisionByZeroError 除数为0的错误- AssertionError 声明错误- ParseError 解析错误- TypeError 类型错误
  • Exception 异常

PHP RFC

Throwable Interface

function add(int $left, int $right) {
    return $left + $right;
}
try {
    echo add('left', 'right');
} catch (Exception $e) {
    // Handle exception
} catch (Error $e) { // Clearly a different type of object
    // Log error and end gracefully
    var_dump($e);
}

这里,并没有出现服务器500的错误。原因在于,PHP7中的Error把它拦截住了,没有冒泡在服务器中。

object(TypeError)#1 (7) {
  ["message":protected]=>
  string(139) "Argument 1 passed to add() must be of the type integer, string given, called in /Applications/mamp/apache2/htdocs/curl/error.php on line 14"
  ["string":"Error":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(48) "/Applications/mamp/apache2/htdocs/curl/error.php"
  ["line":protected]=>
  int(9)
  ["trace":"Error":private]=>
  array(1) {
    [0]=>
    array(4) {
      ["file"]=>
      string(48) "/Applications/mamp/apache2/htdocs/curl/error.php"
      ["line"]=>
      int(14)
      ["function"]=>
      string(3) "add"
      ["args"]=>
      array(2) {
        [0]=>
        string(4) "left"
        [1]=>
        string(5) "right"
      }
    }
  }
  ["previous":"Error":private]=>
  NULL
}

这样我们就可以通过日志的方式记录他们。

Exceptions in the engine (for PHP 7)

function call_method($obj) {
    $obj->method();
}
try {
    call_method(null); // oops!
} catch (EngineException $e) {
    echo "Exception: {$e->getMessage()}\n";
}
//其实上面的例子我在运行过程中,并没有被EngineException捕获异常,经过测试,也是通过Error进行的错误的拦截

如果异常没有被捕获,PHP将继续担任目前它抛出同样的致命错误。

Reclassify E_STRICT notices

参考资料

相关文章
|
11天前
|
安全 PHP 开发者
PHP中的异常处理:从入门到高级
在PHP的编程世界中,异常处理是一块不可或缺的拼图。本文将通过浅显易懂的语言和实际代码示例,带你了解如何在PHP中捕获、处理异常,并探讨高级异常管理策略。无论你是PHP新手还是资深开发者,这篇文章都能为你提供新的见解和技巧。
19 1
|
14天前
|
PHP 开发者
PHP 中的异常处理:提升代码的健壮性与可维护性
在动态类型语言PHP中,异常处理是确保应用程序稳定性和可靠性的关键机制。通过深入理解异常的类型、捕获和处理,开发者可以构建出能够优雅地响应错误情况的应用程序。本文将探讨如何利用PHP的异常处理功能来避免未处理的错误导致的程序崩溃,并展示如何通过自定义异常类来增强代码的可读性和可维护性。
27 4
|
13天前
|
数据库连接 PHP 开发者
深入理解PHP中的异常处理
【8月更文挑战第7天】在探索PHP编程的海洋中,异常处理是一块不可忽视的礁石。它不仅保护着船只免受暗礁的撞击,还能指引迷航者找到归途。本文将带领读者揭开异常处理的神秘面纱,从基础概念到高级应用,一探究竟。
|
20天前
|
PHP UED 开发者
PHP中的异常处理机制及其最佳实践
【8月更文挑战第1天】在PHP开发中,异常处理是确保应用健壮性和可靠性的关键环节。本文将深入探讨PHP的异常处理机制,包括错误与异常的区别、如何抛出和捕获异常、自定义异常类的设计以及异常处理的最佳实践。通过实例分析,我们将了解如何优雅地管理运行时错误,提高代码的可维护性和用户体验。
|
20天前
|
PHP 开发者 UED
深入理解PHP中的异常处理
【7月更文挑战第31天】在PHP开发过程中,异常处理是不可或缺的一部分。它允许开发者捕获和处理运行时出现的错误,从而避免程序意外终止。本文将通过具体示例探讨PHP的异常处理机制,包括如何抛出和捕获异常,以及如何使用自定义异常类来增强错误管理。
13 1
|
20天前
|
Cloud Native PHP Docker
PHP 中的异常处理:提升代码的健壮性云原生时代的微服务架构实践
【7月更文挑战第31天】在PHP开发中,异常处理是确保应用程序稳定性和可靠性的关键。本文将引导您了解如何在PHP中实现有效的异常处理机制,通过实际代码示例展示如何捕获和处理异常,以及如何使用自定义异常类来增强错误管理的灵活性。我们将探索不同的异常处理策略,并讨论它们对提升代码质量的影响。 【7月更文挑战第31天】在数字化浪潮的推动下,云原生技术正成为企业转型的关键。本文将深入探讨如何在云平台上利用微服务架构实现敏捷开发和高效运维,通过具体的代码示例,揭示微服务与容器化部署的协同优势,同时指出在实施过程中可能遇到的挑战及应对策略。
22 1
|
27天前
|
数据库连接 PHP 开发者
PHP中的异常处理机制与最佳实践
【7月更文挑战第25天】在PHP开发中,异常处理是维护程序健壮性的关键。本文将深入探讨PHP的异常处理机制,包括如何抛出和捕获异常,以及如何设计异常类。同时,我们将讨论一些最佳实践,帮助开发者避免常见的陷阱并提高代码质量。
37 5
|
1月前
|
数据库连接 PHP 开发者
PHP中的异常处理:深入理解与最佳实践
在PHP编程中,异常处理是确保应用程序健壮性和错误管理的关键机制。本文将深入探讨PHP的异常处理机制,包括其工作原理、如何正确抛出和捕获异常,以及如何利用异常处理来提升代码质量和维护性。我们将通过实例演示如何在PHP中实现有效的异常处理策略,并讨论在不同场景下的最佳实践。 【7月更文挑战第16天】
|
13天前
|
PHP 开发者 UED
深入理解PHP中的异常处理
在PHP编程中,异常处理是确保应用健壮性的关键机制之一。本文将探讨PHP的异常处理机制,包括如何抛出和捕获异常,以及如何使用自定义异常类来增强错误处理的能力。通过实际示例,我们将了解如何在复杂的应用程序中实现有效的异常管理策略。
21 0
|
15天前
|
PHP 数据库 开发者
PHP中的异常处理:提升代码的健壮性与可维护性
在动态编程语言PHP中,异常处理是确保应用程序稳定性和可靠性的关键机制。本文将深入探讨如何在PHP中有效地使用异常处理来捕获错误、处理不可预见的情况并优雅地恢复程序执行。我们将通过具体示例展示如何实现异常处理,以及它如何帮助开发者编写出更加健壮和易于维护的代码。