加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP异常与异常处理

发布时间:2022-11-01 15:01:21 所属栏目:PHP教程 来源:未知
导读: PHP 异常与异常处理 一、异常 异常,是在程序运行中所发生的,由外部原因导致的可预料的错误,不是由代码本身,和 PHP 引发的错误。 异常处理,是将错误处理的控制流从正常运行的控制流中分

PHP 异常与异常处理 一、异常 异常,是在程序运行中所发生的,由外部原因导致的可预料的错误,不是由代码本身,和 PHP 引发的错误。 异常处理,是将错误处理的控制流从正常运行的控制流中分离开, 使我们再也不用检查一个特定的错误,并在程序的多处地方对其进行控制。 二、PHP 错误处理机制 1、错误报告级别 值 1 2 4 8 16 32 64 128 256 512 1024 16384 2048 预定义常量 E_ERROR E_WARNING E_PARSE E_NOTICE E_CORE_ERROR E_CORE_WARNING E_COMPILE_ERROR E_COMPILE_WARNING E_USER_ERROR E_USER_WARNING E_USER_NOTICE E_USER_DEPRECATED E_STRICT 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。 4096 E_RECOVERABLE_ERROR 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致 PHP 引擎处于不稳定的状态。 如 果 该 错 误 没 有 被 用 户 自 定 义 句 柄 捕 获 ( 参 见 set_error_handler()) ,将成为一个 E_ERROR 从而脚本会终止运行。

用户产生的 错误/警告/通知/运行时通知。 类似用户使用 trigger_error() 函数产生 说明 致命错误。脚本终止运行。如内存分配导致的问题 警告 编译时语法解析错误PHP异常处理, 由分析器产生 通知 PHP 初始化过程中发生的致命错误 /警告。由 PHP 引擎核心产生 编译时发生的致命错误 /警告。由 zend 脚本引擎产生 8192 E_DEPRECATED 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。 E_STRICT 除外的所有错误和警告信息。 30719 E_ALL 2、最基本的错误处理 die()等同于 exit()语句,作用是输出一个消息并且退出当前脚本。 这里采用了 if逻辑结构在错误发生之后终止了脚本。但是简单的终止并不是一直都是恰当的做法。 3、错误处理器 // 自定义错误处理器,参数:错误等级(int)$errno、错误信息(string)$errstr function CustomError($errno, $errstr) { echo "Error: [$errno] $errstr

"; echo "Ending Script"; die(); } // 设置自定义错误处理器,将自定义错误处理器改为脚本运行期间的默认错误处理程序 set_error_handler("CustomError"); // 触发一个等级为 512 的用户错误 trigger_error('trigger an error',512); // 输出结果:“ Error: [512] trigger an error ” 当触发错误时,自定义错误处理器会取得错误级别和错误消息。 然后它会输出错误级别和消息,并终止脚本。 4、日志记录与错误提醒 PHP 默认向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,我们可以向指定的文件或远程目的地发送错误记录。 输出结果:“ Error: [512] Value must be 1 or below ” 三、PHP 异常处理机制 在 PHP 中,你可以抛出任何对象作为一个 PHP 异常;但是,首先该异常应该继承自 PHP的内置异常类, 即 Exception 类。通俗地说,就是按照可以预见的错误类型, 从内置异常类派生出用于不同错误情况的派生类。

1、PHP 的 Exception 类 class Exception {protected $message;// 异常消息内容 protected $code;// 异常代码 protected $file;// 抛出异常的文件名 protected $line;// 抛出异常在该文件中的行号 public __construct ($message = null, $code = null, $previous = null)//异常构造函数} Class MyException extents Exception{}; 2、一般处理方法 Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。 final public string getMessage ()// 获取异常消息内容 final public Exception getPrevious ()// 返回异常链中的前一个异常 final public int getCode ()// 获取异常代码 final public string getFile ()// 获取发生异常的程序文件名称 final public int getLine ()// 获取发生异常的代码在文件中的行号 final public array getTrace ()// 获取异常追踪信息 final public string getTraceAsString ()// 获取字符串类型的异常追踪信息 public string __toString ()// 将异常对象转换为字符串 final private void __clone ()}// 异常克隆 Throw - 这里规定如何触发异常。

每一个 "throw" 必须对应至少一个 "catch"。 Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。 Try{ //可能抛出异常的代码块 throw new MyException(); //从这里开始, try 代码块内的代码将不会被执行 echo "never executed"; }catch(myException $e){ //处理异常信息 echo $e->getMessage(); } 如果捕获了异常, 就要对它进行适当的处理。 不要捕获异常之后又把它丢弃, 不予理睬。 3、多个异常 如果确定 try 代码块内可能抛出多个已定义的异常, 在 catch 语句中尽可能指定具体的异常类型,必要时使用多个 catch,不要试图处理所有可能出现的异常。 Class CustomException extents Exception{}; try { //条件 A if(A) { //如果触发条件 A,抛出自定义异常 customException throw new CustomException("customException"); } if(B) { //如果触发条件 B,抛出异常 Exception throw new Exception("Exception"); } } // 第一个 catch catch (CustomException $e) { echo $e->getMessage(); } // 第二个 catch catch(Exception $e) { echo $e->getMessage(); } 4、重新抛出异常 脚本应该对用户隐藏系统错误。

对程序员来说,系统错误也许很重要, 但是用户对它们并不感兴趣。为了让用户更容易使用,可以再次抛出带有对用户比较友好的消息的异常。 Class CustomException extents Exception{}; try{ //抛出异常 Exception throw new Exception("Exception"); }catch(Exception $e) { // 抛出新的自定义异常,其中使用对用户比较友好的消息。 throw new CustomException(" 对不起,程序运行出错! "); } 5、顶层异常处理器 有时候我们希望统一处理抛出的异常, 或者说,为了保证所有可能抛出的异常都被捕获到,我们会在顶层设置一个自定义异常处理器,来捕获所有未被捕获的异常。 // 自定义异常处理器 function myException($e) { echo "Exception: " , $e->getMessage(); } //设置自定义异常处理器 set_exception_handler('myException'); //抛出一个异常,不使用 catch 进行捕获 throw new Exception('Uncaught Exception occurred'); //输出:“ Exception:Uncaught Exception occurred ” 四、Zend Framework 中的异常处理 Zend Framework 中的 MVC 元件利用了一个前端控制器,这意味着到一个站点的所有请求都将通过单一入口。

PHP异常处理_php soapclient 异常_php抛出异常

因此,所有的异常最终将起泡到前端控制器, 开发人员可在一个位置处理这些异常。 但是,异常消息以及回溯信息可能含有敏感的系统信息,比如 SQL 语句,文件位置等等。为了保护站点, Zend_Controller_Front 默认将捕捉所有异常并注册到响应对象,响应对象默认不会显示异常消息。 Zend Framework 的 MVC 中通过 Zend_Controller_Front 注册的异常处理插件, 从响应对象中捕捉了异常,然后重定向到一个一般性的错误页面或者主页。 Class NewException extents Zend_Exception{} 1、异常处理方法 Zf 默认的错误处理插件 Zend_Controller_Plugin_ErrorHandlr 提供了一个活动的插件,用来处理从程序抛出的异常,包括那些从缺控制器或动作的来的结果。 // Zend_Controller_Front 前端控制器注册相关插件 require_once 'Zend/Controller/Plugin/ErrorHandler.php'; $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100); ErrorHandler 能够动态地监视两种来源的异常:由于缺失控制器或动作方法而产生的异常,和动作控制器里产生的异常,除此之外,它不抓取由其它插件或路由产生的异常。

ErrorHandler 检查的异常被存在响应对象里,如果发现有异常,它试图转发给注册的错误处理器。 // 分发器循环代码中的一部分 // 如果有对 route 获得的模块名、控制器名、动作名有修改的,在这里执行 $this->_plugins->preDispatch($this->_request); try { // 开始分发 $dispatcher->dispatch($this->_request, $this->_response); } catch (Exception $e) { // 如果$this->throwExceptions() 为 true,表示通知前端控制器,由开发人员来 处理异常,而不是让响应对象收集或者使用错误处理器插件 if ($this->throwExceptions()) { throw $e; } // 异常存入响应对象 $this->_response->setException($e); } // postDispatch() 执行阶段开始渲染 view $this->_plugins->postDispatch($this->_request); 前端控制器中还有一个 returnResponse() 方法,如果传入 true 值,dispatch() 将不渲染响应对象,而是将其返回。

获得响应对象后,可通过 isException() 测试是否捕捉到异常,然后通过 getException() 获取异常。 // 检查响应对象是否有异常 if ($response->isException()) { // 获取异常$exceptions = $response->getException();// 其它处理方式 } 如果在派遣错误处理器时发生异常, 它将告诉前端控制器抛出异常, 并重新抛出响应对象注册的最后一个异常。 如果发生异常, 它将转向一个错误处理控制器。 该处理器会涵盖大多数异常情况,并能够优美的处理控制器或者动作缺失异常。 2、异常的打印显示 默认的错误控制处理被假定为 ErrorController 以及其中定义的 errorAction 方法,对应视图脚本 error.phtml. $error = $this->_getParam('error_handler');获取由 ErrorHandler 插件转发来的对象,在 index 方法内做统一处理,最后在前端显示。 ErrorController 不是必须的,但是通过 ErrorController 可以打印异常堆栈,查找异常位置,定位异常,方便找到解决方法。对于异常的处理可以在这里进行统一的处理。zendstar@sina.com 2014-08-19

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!