php拦截异常怎么写

JavaEE开发之SpringMVC中的自定义拦截器及异常处理 也就是说,接下来我们所创建的拦截器就类似于收费站的作用、所有的用户请求都会经过我们这个拦截器。HandlerInterceptorAdapter是Spring框架中自定义拦截器的适配器,我们可以看一下HandlerInterceptorAdapter抽象类的具体实现,下方是我们关联的Spring框架的源代码中的HandlerInterceptorAdapter抽象类的实现。接下来所做的就是在相应的Controller相应的方法中给message_key标签绑定相应的值,并在相应的模板文件中进行显示。 阅读详情

php拦截异常可以通过PHP的错误、异常机制及其内建数’set_exception_handler’、‘set_error_handler’、‘register_shutdown_function’ 来写。

‘set_exception_handler’ 函数 用于拦截各种未捕获的异常,然后将这些交给用户自定义的方式进行处理

‘set_error_handler’ 函数可以拦截各种错误,然后交给用户自定义的方式进行处理 (推荐学习:PHP视频教程)

‘register_shutdown_function’ 函数是在PHP脚本结束时调用的函数,配合’error_get_last’可以获取最后的致命性错误

这个思路大体就是把错误、异常、致命性错误拦截下来,交给我们自定义的方法进行处理,我们辨别这些错误、异常是否致命,如果是则记录的数据库或者文件系统,然后使用脚本不停的扫描这些日志,发现严重错误立即发送邮件或发送短信进行报警

首先我们定义错误拦截类,该类用于将错误、异常拦截下来,用我们自己定义的处理方式进行处理,该类放在文件名为’errorHandler.class.php’中,代码如下:

/**
* 文件名称:baseErrorHandler.class.php
* 摘 要:错误拦截器父类
*/
require 'errorHandlerException.class.php';//异常类
class errorHandler
{
public $argvs = array();
public  $memoryReserveSize = 262144;//备用内存大小
private $_memoryReserve;//备用内存
/**
* 方  法:注册自定义错误、异常拦截器
* 参  数:void
* 返  回:void
*/
public function register()
{
ini_set('display_errors', 0);
set_exception_handler(array($this, 'handleException'));//截获未捕获的异常
set_error_handler(array($this, 'handleError'));//截获各种错误 此处切不可掉换位置
//留下备用内存 供后面拦截致命错误使用
$this->memoryReserveSize > 0 && $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
register_shutdown_function(array($this, 'handleFatalError'));//截获致命性错误
}
/**
* 方  法:取消自定义错误、异常拦截器
* 参  数:void
* 返  回:void
*/
public function unregister()
{
restore_error_handler();
restore_exception_handler();
}
/**
* 方  法:处理截获的未捕获的异常
* 参  数:Exception $exception
* 返  回:void
*/
public function handleException($exception)
{
$this->unregister();
try
{
$this->logException($exception);
exit(1);
}
catch(Exception $e)
{
exit(1);
}
}
/**
* 方  法:处理截获的错误
* 参  数:int  $code 错误代码
* 参  数:string $message 错误信息
* 参  数:string $file 错误文件
* 参  数:int  $line 错误的行数
* 返  回:boolean
*/
public function handleError($code, $message, $file, $line)
{
//该处思想是将错误变成异常抛出 统一交给异常处理函数进行处理
if((error_reporting() & $code) && !in_array($code, array(E_NOTICE, E_WARNING, E_USER_NOTICE, E_USER_WARNING, E_DEPRECATED)))
{//此处只记录严重的错误 对于各种WARNING NOTICE不作处理
$exception = new errorHandlerException($message, $code, $code, $file, $line);
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_shift($trace);//trace的第一个元素为当前对象 移除
foreach($trace as $frame) 
{
if($frame['function'] == '__toString') 
{//如果错误出现在 __toString 方法中 不抛出任何异常
$this->handleException($exception);
exit(1);
}
}
throw $exception;
}
return false;
}
/**
* 方  法:截获致命性错误
* 参  数:void
* 返  回:void
*/
public function handleFatalError()
{
unset($this->_memoryReserve);//释放内存供下面处理程序使用
$error = error_get_last();//最后一条错误信息
if(errorHandlerException::isFatalError($error))
{//如果是致命错误进行处理
$exception = new errorHandlerException($error['message'], $error['type'], $error['type'], $error['file'], $error['line']);
$this->logException($exception);
exit(1);
}
}
/**
* 方  法:获取服务器IP
* 参  数:void
* 返  回:string
*/
final public function getServerIp()
{
$serverIp = '';
if(isset($_SERVER['SERVER_ADDR']))
{
$serverIp = $_SERVER['SERVER_ADDR'];
}
elseif(isset($_SERVER['LOCAL_ADDR']))
{
$serverIp = $_SERVER['LOCAL_ADDR'];
}
elseif(isset($_SERVER['HOSTNAME']))
{
$serverIp = gethostbyname($_SERVER['HOSTNAME']);
}
else
{
$serverIp = getenv('SERVER_ADDR');
}  
return $serverIp; 
}
/**
* 方  法:获取当前URI信息
* 参  数:void
* 返  回:string $url
*/
public function getCurrentUri()
{
$uri = '';
if($_SERVER ["REMOTE_ADDR"])
{//浏览器浏览模式
$uri = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
}
else
{//命令行模式
$params = $this->argvs;
$uri = $params[0];
array_shift($params);
for($i = 0, $len = count($params); $i < $len; $i++)
{
$uri .= ' ' . $params[$i];
}
}
return $uri;
}
/**
* 方  法:记录异常信息
* 参  数:errorHandlerException $e 错误异常
* 返  回:boolean 是否保存成功
*/
final public function logException($e)
{
$error = array(
'add_time'  =>  time(),
'title'  =>  errorHandlerException::getName($e->getCode()),//这里获取用户友好型名称
'message'  =>  array(),
'server_ip' =>  $this->getServerIp(),
'code'   =>  errorHandlerException::getLocalCode($e->getCode()),//这里为各种错误定义一个编号以便查找
'file'   => $e->getFile(),
'line'   =>  $e->getLine(),
'url'  => $this->getCurrentUri(),
);
do
{
//$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')'
$message = (string)$e;
$error['message'][] = $message;
} while($e = $e->getPrevious());
$error['message'] = implode("\r\n", $error['message']);
$this->logError($error);
}
/**
* 方  法:记录异常信息
* 参  数:array $error = array(
*         'time' => int, 
*         'title' => 'string', 
*         'message' => 'string', 
*         'code' => int,
*         'server_ip' => 'string'
*          'file'  => 'string',
*         'line' => int,
*         'url' => 'string',
*        );
* 返  回:boolean 是否保存成功
*/
public function logError($error)
{
/*这里去实现如何将错误信息记录到日志*/
}
}

上述代码中,有个’errorHandlerException’类,该类放在文件’errorHandlerException.class.php’中,该类用于将错误转换为异常,以便记录错误发生的文件、行号、错误代码、错误信息等信息,同时其方法’isFatalError’用于辨别该错误是否是致命性错误。

PHP 错误异常处理机制及 Laravel 框架底层的相应实现 错误和异常是很强大的工具,能帮助我们预期意料之外的事,使用优雅的方式捕获问题。不过,错误和异常很相似,容易让人混淆,二者都表示出问题了,都会提供错误信息,而且都有错误类型。然而,错误出现的时间比异常早,错误会导致程序脚本停止执行,如果可能,错误会委托给全局错误处理程序处理,有些错误是无法恢复的。对于高版本 PHP 我们基本上只需要处理异常,不用管错误,但我们仍然必须做好防御准备,因为 PHP 中很... 阅读详情

相关推荐

【PHP】PHP7的异常处理详解

前言 PHP7的改动中,影响比较大的,包括异常处理。 概述 更多的异常是直接通过PHP直接处理的,和之前的PHP5不同的是更多的异常是通过Error exceptions来抛出。 作为一个普通的扩展,Error exceptions会持续冒出直到匹配到对应的catch块。如果没有进行匹配,就会触发被设置的set_exception_handler()来执行处理,如果没有默认的异常处理程序,

Code Metaverse 5689

拦截PHP各种异常和错误,发生致命错误时进行报警

https://www.cnblogs.com/painsOnline/p/5141346.html

大洋 1220

PHP各种异常和错误的拦截方法及发生致命错误时进行报警

在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式。在开发的时候可以查看各种错误、异常,但是在线上就把错误显示的关闭。 上面的情形看似很科学,有人解释为这样很安全,别人看不到错误,以免泄露重要信息… 但是你有没有遇到这种情况,线下好好的,一上线却运行不起来也找不到原因… 一个脚本,跑了好长一段时间,一直没有问题,有一天突然中断了,然后了也没有任何记录都不造啥原因… 线上一个付款,别人明明付了款,但是我们却没有记录到,自己亲自去实验,却是好的… 种种以上,都是因为大家关闭了错误信息,并且未将错误、异常记录到日志,导致那些随机发生的错误很难追踪。这样矛盾就来了

PHP实现一个简单url路由功能

现在写一个php例子,假设我的ip为192.168.0.33,我加了一层名为router的路径,之后跟随的是 “/模块名/方法名/参数1的key/参数1的value/….” 类似这样的地址: 192.168.0.33/router/Hello/router/a/b/c/d/abc/index.html?id=3&url=http:……………… 也就是要调用Ha这个模块中的router方法,并

qq_23024699的博客 2506

《QMT量化实战系列》支持自定义筛选与排序的多因子策略,实测年化收益超100%

【QMT量化实战系列】推出《支持自定义筛选与排序的多因子策略》,通过Tushare获取38个核心因子数据,实现股票多维筛选(剔除ST股、次新股及特定板块)。策略创新性地采用多因子加权排名机制,通过(股票数-排名+1)/股票数*100的算法计算各因子得分,支持自定义权重组合。该策略提供完整代码及详细注释,涵盖数据获取、因子筛选、权重排序等核心环节,帮助用户构建个性化量化模型。系列内容每月更新1-2期,由浅入深讲解QMT平台实战应用。

qq_46262068的博客 1255

手把手教你用ZEMAX复现贝塞尔光束:从Thorlabs锥透镜到Edmund透镜的完整光路搭建

本文详细介绍了如何在ZEMAX光学设计软件中复现贝塞尔光束,从Thorlabs锥透镜到Edmund透镜的完整光路搭建过程。通过逐步指导,帮助研究人员和工程师掌握光学设计技巧,实现无衍射特性的贝塞尔光束生成,适用于激光加工和生物成像等领域。

weixin_33737774的博客 175

php错误拦截机制,php拦截异常怎么写-PHP问题

php拦截异常可以通过PHP的错误、异常机制及其内建数'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 来写。首先我们定义错误拦截类,该类用于将错误、异常拦截下来,用我们自己定义的处理方式进行处理,该类放在文件名为'errorHandler.class.php'中,代码如下/*** 文件名称:baseE...

weixin_33376592的博客 346

ModbusRTU串口读写报文解析

解析MODBUS报文的格式,讨论异常状态、读多个寄存器与写多个寄存器

Serendipitor的博客 9208

PHP有哪些屏蔽错误的方法

1、@屏蔽法,@在php中一个抑制错误的符号。 即便是你开启了报错功能,只要在错误语句之前加上@符号,便可屏蔽了错误信息。使用@抑制错误之前,会出现一个警告错误。 2、error_reporting屏蔽法。 在php文件开始之前,我们可以加上这样一句话error_reporting(0);这个函数的意思是设置 PHP 的报错级别并返回当前级别,0则代表禁用错误报告。 3、display_errors屏蔽法。 前两种方法只能作用于单行或者单个文件,这个则是作用于所有的php文件。打开php.in..

积善之家 2875

基于Simulink进行光伏逆变器效率分析的仿真建模

特点能量转换:将光伏电池板产生的直流电转换为交流电。效率评估:分析逆变器在不同负载条件和环境条件下的效率。动态特性:考虑温度、光照强度等外部因素对逆变器效率的影响。挑战精确建模:准确地模拟光伏电池板、逆变器及其交互的动力学过程。多因素考量:需要同时考虑输入电压、电流、温度、光照强度等多种因素对逆变器效率的影响。集成度:需要与其他系统(如最大功率点跟踪MPPT算法、电网连接等)无缝集成,以实现全面的系统分析。首先明确要模拟的任务内容。输入条件(如光照强度、温度等)。

amy_mhd的博客 142

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 802

php 拦截方法名,php拦截异常怎么写

php拦截异常可以通过PHP的错误、异常机制及其内建数'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 来写。'set_exception_handler' 函数用于拦截各种未捕获的异常,然后将这些交给用户自定义的方式进行处理'set_error_handler' 函数可以拦截各种错误,然后交给用户自定...

weixin_28963467的博客 233

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 2874

laravel 异常拦截

<?php namespace App\Exceptions; use Exception; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Han...

qq_29755359的博客 817

计算机视觉教程1-1:透视空间与透视变换

在生活中,透视现象很常见,其物理本质是光的直线传播。由于人眼与相机在捕获图像时均存在透视现象,因此计算机几何基于透视空间进行研究。本节介绍透视变换原理

FRIGIDWINTER的博客 3089

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3838

Spring MVC拦截器、文件上传和全局异常处理

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。过滤器与拦截器的区别:拦截器是AOP思想的具体应用。目录:拦截器,文件上传,全局异常处理器。

这河里吗l的博客 1347

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然

在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式。在开发的时候可以查看各种错误、异常,但是在线上就把错误显示的关闭。 上面的情形看似很科学,有人解释为这样很安全,别人看不到错误,以免泄露重要信息… 但是你有没有遇到这种情况,线下好好的,一上线却运行不起来也找不到原因… 一个脚本,跑了好长一段时间,一直没有问题,有一天突然中断了,然后了也没有任何记录都不造啥原因… 线上一个付款,别人明明付了款,但是我们却没有记录到,自己亲自去实验,却是好的… 种种以上,都是因为大家关闭了错误信息

读万卷书,行万里路 436

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

PHP域名拦截检测平台源码

介绍: PHP微信域名拦截检测平台源码 查询域名是否被QQ/微信拦截 在微信/QQ中进行推广的网页内容管控得越来越严格了,如果自己的域名被微信封了,用户打不开,会造成很大的流量损失和客户流失。 我们做推广的时候,需要对域名检测,判断是否被微信屏蔽了。 那么此时就要用到域名检测接口,实时检测域名的状态,查询域名是否被QQ/微信拦截,有异常及时通知,非常稳定,准确率高。 从而可以在短暂时间内调整过来,不影响网站运行和人员的运营。 网盘下载地址: http://kekewl.net/ELV517dNyvT 图

工具下载 446

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【PHP开发900个实用技巧】639.finally块的救赎:PHP异常处理流程的“定海神针”

在PHP开发中,`finally`块是异常处理流程中的“定海神针”,它确保了无论程序是否发生异常,某些关键操作(如资源释放、日志记录等)都会被执行。本文通过五个部分深入探讨了`finally`块的使用技巧和注意事项。 首先,**finally基础**部分介绍了`finally`块的基本功能,它就像代码的保险箱,确保资源在异常情况下也能被正确释放。其次,**return与finally**部分揭示了`return`与`finally`的优先级问题,强调在`finally`中使用`return`会覆盖之前的返

1096

PHP错误和异常详解(PHP7错误处理)

世界上没有绝对完美的事,对于程序员来说更是如此,无论我们多么努力、多么细心的开发一个项目,总会有缺陷和错误的存在。错误和异常的异同"错误"和"异常"的概念十分相似,很容易混淆,"错误"和"异常"都表明了项目出了问题,都会提供相关的信息,并且都有错误类型。然而,"异常机制"是在"错误机制"后才出现的,"异常"是避免"错误"的不足。比较重要的一点就是因为

Toby的博客 5511

php 抛出异常后代码还继续执行,异常后将PHP恢复到执行脚本

我有一个PHP脚本让我们说在执行过程中脚本会抛出异常.我希望我的PHP从它停止的地方恢复(抛出异常的地方).我应该在代码的“catch”部分放置相同的执行代码吗?例如,让我们说连接到mySQL它失败了连接超时function someCode(){$pdostmt = $this->prepare($this->sql);if($pdostmt->execute($this-&g...

weixin_39636333的博客 1521

php常见错误报警,拦截PHP各种错误和异常,发生致命异常时进行报警,万事防患于未然...

拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式。在开发的时候可以查看各种错误、异常,但是在线上就把错误显示的关闭。上面的情形看似很科学,有人解释为这样很安全,别人看不到错误,以免泄露重要信息...但是你有没有遇到这种情况,线下好好的,一上线却运行不起来也找不到原因...一个脚本,跑了好长一段时间,一直没...

weixin_39601929的博客 229

php 致命错误提示_PHP各种异常和错误的拦截方法及发生致命错误时进行报警

在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式。在开发的时候可以查看各种错误、异常,但是在线上就把错误显示的关闭。上面的情形看似很科学,有人解释为这样很安全,别人看不到错误,以免泄露重要信息...但是你有没有遇到这种情况,线下好好的,一上线却运行不起来也找不到原因...一个脚本,跑了好长一段时间,一直没有问题,有一天突然中断了,然后了也没有任何记录都不造啥原因......

weixin_30552495的博客 643

拦截码php,Laravel 框架返回状态拦截代码

可拦截系统的返回的状态自己在单独处理。使用查询composer require betterde/response// 安装后直接调用以下# storedreturn stored($data, $message = '创建成功');#updatedreturn updated($data, $message = '更新成功');#deletedreturn deleted($message = ...

weixin_42120541的博客 998
上一篇: PHP高并发和大流量的解决方案
下一篇: 如何在python中使用正则表达式从多行字符串中删除特定字符
秋秋1401806571
博客等级 码龄8年 47粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值