php7跑出系统异常,PHP7的异常处理详解

本文详细介绍了PHP7中异常处理的变化,重点讲解了Error类如何替代传统错误处理,并展示了如何使用catch块捕获Error。在PHP7中,更多错误以Errorexceptions形式抛出,不再被Exception捕获。当Error未被捕获时,会触发异常处理程序或转换为致命错误。示例代码演示了如何处理TypeError异常,强调了正确处理Error以避免服务器500错误的重要性。
摘要由CSDN通过智能技术生成

PHP7的异常处理详解

在PHP中碰到异常的时候应该如何处理呢,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!

前言

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 算数错误

PisionByZeroError 除数为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将继续担任目前它抛出同样的致命错误。

【PHP7的异常处理详解】相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值