PHP错误及异常处理机制

作者:掠影
最后编辑时间:
浏览次数:821



PHP错误及异常处理机制

起因

  • 由于PHP一直以来同时存在着所谓的“错误”和“异常”两种异常情况,即对于某些问题,例如fsockopen()或经典的除以0的问题,常常会抛出一个比如Warning级别或者是Vital级别的错误(继承于C的报错级别),而错误往往具有“排他性”,即报错时无法捕获无法处理,无法忽略,只能统一设置报错级别来“过滤”错误;这一特性对于现代编程而言,是相当不友好的:由于它会打断业务逻辑,使得某些操作无法按逻辑流顺利进行;要么会忽略错误后导致无法排错,甚至引起更大的问题;
  • 基于这一现状,PHP中又引入了类似JAVA的异常处理机制,即将一些“异常情况”抽出作为Exception单独处理,而这些异常可以单独捕获(记录/忽略/中断),以及可以手动抛出(用于人为设置异常的场景);故而用异常来取代错误实际上是比较方便且高效的;
  • 即使PHP设计本身也向着这方向努力,甚至在7以后将许多错误都改成了异常;PHP中仍然存在着许多错误情景(相当不友好),故而基于这一现状,我们仍旧需要一系列手动将“错误”当做“异常”来手动处理的方案,从而利用异常这一优秀的机制,更好地进行业务逻辑的处理和操作;
  • 故而本文中,给出以上的手动错误-》异常转换方式

分析

  • 在PHP设计中,错误是可以自定义错误处理器的,函数为set_error_handler(callable $error_func, int $error_type),将指定错误级别的错误输出到$error_func来处理;其中
    • seterrorhandler()
    • $error_func: 可为回调函数,参数为
      • int $errno(错误级别)
      • string $errstr (错误信息)
      • string $errfile (发生错误的文件名)
      • int $errline (发生错误的行号)
      • array $errcontext(错误上下文【abandoned】
    • $error_types: 错误级别
  • 利用这一方案,我们可以将错误转成一个异常来进行处理,即捕获错误后不直接输出,而是利用手动的error_handler抛出异常,通过处理异常的方式来间接性地处理错误;

解决方案

  1. 注册全局错误处理器
    • 利用set_error_handler(), 将所有错误定向到$error_func中进行处理
  2. 注册错误处理函数
    • 声明一个错误函数,或者以回调函数的形式处理得到的异常
  3. 将错误转换为异常以抛出
    • 规整化错误数据,抛出异常:throw new Exception($error_msg, $error_no)
  4. 手动处理/全局异常处理
    • 利用原来的异常处理机制,日志记录或手动处理

例子

function error_handler_local($errno, $errstr, $errfile, $errline){    $err_info = sprintf("#0 %s\n, %s on line %n", $errfile, $errorstr, $errline);    throw new Exception($err_info, $errno);}// 错误定向到`error_handler_local`处理set_error_handler("error_handler_local", E_ALL); try{    echo 1/0;// 触发一个错误    // trigger_error($msg, $no);手动抛出错误}catch(Exception $e){    var_dump($e);exit;}

结论

  • 如上所示,自定义错误处理器以实现错误向异常的转换
  • 优势:
    • 可以统一处理所有的"异常情况",使得所有的问题都是可捕获的
    • 可以利用异常机制来处理原生的错误问题,从而实现编程逻辑的非打断性(即正常逻辑不会被错误处理打断)
  • 希望日后开发组可以将更多的错误转换为异常w

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区