【PHP】PHP7的异常处理详解

简介: 前言PHP7的改动中,影响比较大的,包括异常处理。概述更多的异常是直接通过PHP直接处理的,和之前的PHP5不同的是更多的异常是通过Error exceptions来抛出。

前言

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

参考资料

目录
相关文章
|
25天前
|
前端开发 PHP 开发者
PHP编程中的异常处理与调试技巧
在PHP编程中,异常处理和调试是至关重要的环节。本文将深入探讨PHP中异常处理的机制,介绍常见的异常类型以及如何合理地进行异常处理。同时,还将分享一些实用的调试技巧,帮助开发者快速定位和解决问题,提高代码质量和效率。
13 4
|
29天前
|
PHP 开发者 UED
PHP 中的异常处理:提高代码健壮性的关键
【2月更文挑战第28天】在 PHP 开发中,异常处理是确保应用程序稳定性和可靠性的重要环节。本文将深入探讨 PHP 异常的概念、类型及其处理机制,并通过实例演示如何有效地捕获和处理异常,以增强代码的健壮性和用户体验。
|
9月前
|
程序员 PHP
PHP快速入门12-异常处理,自定义异常、抛出异常、断言异常等示例
PHP的异常处理机制可以帮助我们在程序运行时遇到错误或异常情况时,及时发出警告并停止程序继续运行。下面是10个例子,分别展示了PHP异常处理的不同用法。
PHP异常getTrace(): 获取异常的跟踪信息。是干什么的?
PHP异常getTrace(): 获取异常的跟踪信息。是干什么的?
355 0
|
程序员 PHP
什么是PHP的异常?为什么会有异常?底层原理是什么?
什么是PHP的异常?为什么会有异常?底层原理是什么?
|
PHP
PHP7的异常处理详解
PHP7的异常处理详解
65 0
|
PHP 数据库
PHP异常处理函数,Thinkphp调试
在thinkphp中,除了异常类携带的简单file、code、message、trace等 还会获取当前服务器的配置、脚本的参数(get/post…)、数据库查询语句等 然后组合成一个有排版、数据充足的页面展示给我们,方便了我们排查问题。
102 0
PHP异常处理函数,Thinkphp调试
|
PHP 数据库
简单的说说php异常
简单的说说php异常
60 0
|
PHP
php event异常处理,php set_exception_handler无效
php event异常处理,php set_exception_handler无效
123 0