PHP异常捕捉之温故知新

in 普通BLOG
0 评论 阅读量:270

实际开发中,ExceptionThrowable都是常用的异常处理类

  1. 继承关系

    • Throwable是一个接口,所有异常类(包括ExceptionError)都必须实现这个接口。
    • ExceptionThrowable的一个子类,它提供了基本的异常功能。
  2. 类型兼容性

    • Throwable接口包括两个方法:getMessage()getCode(),所有异常类都必须实现这两个方法。
    • Exception类除了实现Throwable接口外,还提供了一些额外的功能,比如getFile()getLine()getTrace()等,这些方法提供了异常的更多上下文信息。

      所以本人比较喜欢用Exception,丝滑小连招
      try {
       // do sth...
      } catch (\Exception $e) {
       Log::error('XXX失败 @XXX file => ' . $e->getFile() . ' line => ' . $e->getLine() . ' error => ' . $e->getMessage());
      }
  3. 错误类型

    • Exception主要用于处理程序中的异常,这些异常错误通常是在程序执行过程中可以预料到的。
    • Error类是Throwable的另一个子类,它用于处理PHP运行时错误,这些错误通常是由于PHP自身的错误,而不是程序逻辑错误引起的。
      这里需要理解一下[程序异常]、[运行错误]

      function divide($dividend, $divisor) {
       if ($divisor == 0) {
           throw new \Exception("除数不能为0");
       }
       return $dividend / $divisor;
      }
      
      try {
       echo divide(10, 0); // 显式抛出异常
      } catch (\Exception $e) {
       echo "捕获到异常: " . $e->getMessage();
      }
      // 尝试访问一个未定义的变量
      try {
       echo $aaa; // 未定义变量aaa
      } catch (Error $e) {
       echo "捕获到错误: " . $e->getMessage();
      }
  4. 异常捕捉

    • 在PHP 7及以后的版本中,你可以捕获Throwable来捕获所有异常和错误,包括ExceptionError
    • 在PHP 5中,你只能捕获Exception类型的对象,而Error类型的错误不会被try-catch捕获,除非使用set_exception_handler()设置一个全局异常处理器。

      php5某些框架写法不严谨,经常出现数据库select不存在的字段、变量为null之类的报错经常性不会程序终止,而是继续运行。。。
  5. 使用场景

    • 通常,你应该捕获Exception来处理程序中的逻辑错误。
    • 对于Error类型的错误,你应该使用set_error_handler()来设置一个错误处理器,或者使用try-catch块来捕获Throwable
Comments are closed.