当前位置: 首页 > 后端技术 > PHP

php拦截异常怎么写

时间:2023-03-29 17:18:21 PHP

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'的文件中,代码如下;//异常类classerrorHandler{public$argvs=array();public$memoryReserveSize=262144;//预留内存大小private$_memoryReserve;//备用内存/***方法:注册自定义错误,异常拦截器*参数:void*return:void*/publicfunctionregister(){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->内存oryReserveSize);register_shutdown_function(array($this,'handleFatalError'));//拦截致命错误}/***方法:取消自定义错误,异常拦截*参数:void*返回:void*/publicfunctionunregister(){restore_error_handler();restore_exception_handler();}/***方法:处理截获的未捕获异常*参数:Exception$exception*返回:void*/publicfunctionhandleException($exception){$this->unregister();try{$this->logException($exception);exit(1);}catch(Exception$e){exit(1);}}/***方法:处理拦截Error*参数:int$code错误码*参数:string$messageErrormessage*参数:string$file错误文件*参数:int$line错误行号*返回:boolean*/publicfunctionhandleError($code,$message,$file,$line){//这里的思路是转error转化为异常,交给异常处理函数处理PRECATED))){//这里只记录严重的错误。不处理各种警告通知。$exception=newerrorHandlerException($message,$code,$code,$file,$line);$trace=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);array_shift($trace);//trace的第一个元素是当前对象Removeforeach($traceas$frame){if($frame['function']=='__toString'){//如果错误发生在__toString方法不抛出任何异常$this->handleException($exception);exit(1);}}throw$exception;}returnfalse;}/***方法:拦截致命错误*参数:void*return:void*/publicfunctionhandleFatalError(){unset($this->_memoryReserve);//释放内存供后面的handler使用$error=error_get_last();//最后的错误信息if(errorHandlerException::isFatalError($error)){//如果是致命错误,处理$exception=newerrorHandlerException($error['message'],$error['type'],$error['type'],$error['file'],$error['line']);$this->logException($exception);exit(1);}}/***方法:获取服务器IP*参数:void*返回:string*/finalpublicfunctiongetServerIp(){$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');}关于转$serverIp;}/***方法:获取当前URI信息*参数:void*返回:string$url*/publicfunctiongetCurrentUri(){$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是否保存成功*/finalpublicfunctionlogException($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是否保存成功*/publicfunctionlogError($error){/*这里实现如何将错误信息记录到日志中*/}}在上面的代码中,有一个'errorHandlerException'类,放在文件'errorHandlerException.class.php'中,用于forConverttheerrorintoexception记录发生错误的文件、行号、错误代码、错误信息等信息。同时,它的方法'isFatalError'用于识别该错误是否为致命错误。以上就是php拦截异常怎么写的详细内容,希望对大家有所帮助。相关文章:阅读原文