错误处理与程序Debug方法

Source:phpbone.com  Author:IT柏拉图
2013-11-20

系统已把错误拦截到 lib_debug.php 的相关函数,在调试模式下,这里会对所有级别的错误在页面执行完之后显示出来,重点需注意下面几点:

1、模板里尽量不要出现不确定的数组元素(通常是从request里来的),否则容易引发未定义警告;

2、在使用 try{ ........ } cacth(){ ......... } 语句时,在 try 块里使用 throw new Exception 正常的抛出 throw,不过在 cacth 块里,不应该自行编写调试信息,而是用 trigger_error(错误原因);这样处理,在有必要 exit 的情况下可以退出,否则返回交由 debug 程序处理。例如:

  1. try 
  2.         { 
  3.             iffile_exists$path_file ) ) 
  4.             { 
  5.                 require $path_file
  6.             } 
  7.             else iffile_exists$path_file2 ) ) 
  8.             { 
  9.                 require $path_file2
  10.               
  11.             } else { 
  12.                 throw new Exception ( "Contrl {$ctl}--{$path_file} is not exists!" ); 
  13.             } 
  14.             if( method_exists ( $ctl$ac ) === true ) 
  15.             { 
  16.                 $instance = new $ctl( ); 
  17.                 $instance->$ac(); 
  18.             } else { 
  19.                 throw new Exception ( "Method {$ctl}::{$ac}() is not exists!" ); 
  20.             } 
  21.         } 
  22.         catch ( Exception $e ) 
  23.         { 
  24.             bone::fatal_error( 'bone.php run_controller()'$e->getMessage().' url:'.util::get_cururl() ); 
  25.         } 



3、在代码可能因为某些值导致出现在逻辑错误的地方,也判断一下,并用 trigger_error( 错误说明 ) 向错误调试程序返回一个错误信息,这样可以方便的实现程序的调试。

x、未能实现的代码
由于 php 出现致命错误(Fatal error)时会强制中断程序,因此调试程序是无法跟踪这种情况的,此外,下面几种错误都是无法捕获的:
E_ERROR           => 致命错误
E_PARSE           => 解析错误
E_CORE_ERROR      => 核心致命错误
E_CORE_WARNING    => 核心警告
E_COMPILE_ERROR   => 编译致命错误
E_COMPILE_WARNING => 编译警告
虽然程序可以通过 ob_start 去控制缓存的输出,但这可能会导致内部程序编写逻辑混乱,因此并不对这些情况进行处理。

4、自定义性能追踪函数
test_debug_mt( '位置说明' )
程序会在调试模式下程序结束时输出相应位置的内存和与上一调用此函数位置间的间隔时间,这适用于可能占较大资源的性能追踪
使用时需要在相应接口开始使用一次 test_debug_mt( '初始化' );  (主要考虑某些ajax等内部调用不方便输出测试信息)

5、xhprof 性能追踪系统
在Debug或客户端安全模式下,系统会开启xhprof性能跟踪系统,此系统能跟踪程序所有执行类及入口占用时间比例等信息(这个不会显示内存信息)。

6、用try catch处理Exception
使用trigger_error显示普通错误,不会中断程序执行,如果模型类使用了 throw new Exception( $errmsg ); ,控制器必须使得  try catch 对异常进行捕获,并进行相应的处理。


 

分享到: