php中的错误和异常是两个不同的概念。

错误:是因为脚本的问题,比如少写了分号,调用未定义的函数,除0,等一些编译语法错误。

异常:是因为业务逻辑和流程,不符合预期情况,比如验证请求参数,不通过就用 throw new 抛一个异常。

在php5的版本中,错误是无法被 try {} catch 捕获的,如下所示:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'on'); try {
hello();
} catch (\Exception $e) {
echo $e->getMessage();
}

运行脚本,最终php报出一个Fatal error,并程序中止。

Fatal error: Uncaught Error: Call to undefined function hello()

有些时候,我们需要捕获这种错误,并做相应的处理。

那就需要用到 register_shutdown_function() 和 error_get_last() 来捕获错误

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'on'); //注册一个会在php中止时执行的函数
register_shutdown_function(function () {
//获取最后发生的错误
$error = error_get_last();
if (!empty($error)) {
echo $error['message'], '<br>';
echo $error['file'], ' ', $error['line'];
}
}); hello();

我们还可以通过 set_error_handler() 把一些Deprecated、Notice、Waning等错误包装成异常,让 try {} catch 能够捕获到。

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'on'); //捕获Deprecated、Notice、Waning级别错误
set_error_handler(function ($errno, $errstr, $errfile) {
throw new \Exception($errno . ' : ' . $errstr . ' : ' . $errfile);
//返回true,表示错误处理不会继续调用
return true;
}); try {
$data = [];
echo $data['index'];
} catch (\Exception $e) {
//捕获Notice: Undefined index
echo $e->getMessage();
}

对于php7中的错误捕获,因为php7中定义了 Throwable 接口,大部分的 Error 和 Exception 实现了该接口。

所以我们在php7中,可以通过 try {} catch(\Throwable $e) 来捕获php5中无法捕获到的错误。

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'on'); try {
hello();
} catch (\Throwable $e) {
echo $e->getMessage();
}

  

php捕获Fatal error错误与异常处理的更多相关文章

  1. [PHP] error_reporting(0)可以屏蔽Fatal error错误

    按照以前的印象,error_reporting(0)屏蔽不了php的Fatal error级别的错误.但是今天我遇到了一个问题才发现,它竟然可以屏蔽任何错误,包括Fatal error,浏览器会看不到 ...

  2. 再谈PHP错误与异常处理

    博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...

  3. PHP错误与异常处理

    https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html 请一定要注意,没有特殊说明:本例 PHP Version < 7 说起PHP异常处理,大 ...

  4. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)

    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...

  5. “fatal error C1010”错误解决的三种方法

    尝试写了一个简单的类文件,但在编译的时候提示错误,具体错误信息如下: fatal error C1010: unexpected end of file while looking for preco ...

  6. 错误提示:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 的解决方法

    最近在win7 系统下,打算利用 cmake 生成项目文件,然后用vs2010进行编译.但是在cmake的时候出现错误弹窗:

  7. VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法

    VC连接MySQL的配置过程在上一篇博文中,不过当你设置好,以为万事大吉的时候,运行却出现这个错误:libmysql.lib : fatal error LNK1113: invalid machin ...

  8. mysql 主从 Got fatal error 1236 from master when reading data from binary log: 'Could not find first 错误

    本地MySQL环境,是两台MySQL做M-M复制.今天发现错误信息: mysql 5.5.28-log> show slave status\G ************************ ...

  9. magento后台 Fatal error: Call to a member function getId() on a non-object in错误

    后台分类管理出现错误 Fatal error: Call to a member function getId() on a non-object in 在数据库中运行以下sql语句 INSERT I ...

随机推荐

  1. mysql DDL 锁表

    mysql DDL 锁表 select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.i ...

  2. 一天两道pat(3)1007,1008

    1007没什么好说的,就是注意暴力求素数的时候,循环到(根号n)+1就好: 重点说说1008,不用新开一个数组就实现循环移位的操作 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下 ...

  3. 关于dom4j解析XML的问题分享

    最近在在做个程序需要将C#小工具转成java,因为需要涉及到操作xml文件所以需要引用dom4j: 使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速 ...

  4. github用户注册和仓库创建

    访问github官网:https://github.com/,点击注册进入注册页面 输入用户名,电子邮箱和密码后点击下一步 邮箱验证,收到github的验证邮箱,打开后点击验证 选择个人计划 创建仓库 ...

  5. Java 并发编程 | 线程池详解

    原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...

  6. 计算机网络知识(TCP连接,TCP/UDP区别,HTTP与HTTPS,Socket原理等等)

    1.网络七层协议包含,物理层.数据链路层.网络层(ip协议).传输层(TCP传输控制协议.UDP用户数据报协议).会话层.表示层.应用层(http协议).是一个提供的概念架构协议. 2.TCP/IP协 ...

  7. HTML中的三元表达式,灵活的使用or逻辑判断

    08.27自我总结 HTML中的三元表达式 判断内容 ? 满足返回的值 : 不满足返回的值 灵活使用or逻辑判断 比如我们某个变量为空的时候返回他另外个值 var a = msg || '没有消息'

  8. SSH框架之Struts2第一篇

    1.2 Struts2的概述 : Struts2是一个基于MVC设计模式的WEB层的框架. 1.2.1 常见web层框架 Struts1,Struts2,WebWork,SpringMVC Strut ...

  9. Java面试基础 -- Docker篇

    1.什么是Docker? Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. 2.什么是Docker镜像? Docker镜像是 ...

  10. 父子间的通信,以及ref

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...