当前位置:首页 > PHP教程 > php类库 > 列表

PHP系统异常处理类程序

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-22 11:39:10 浏览: 评论:0 

以前我们用过的异常处理函数都是单个的,下面我找到一个非常的不错的异常处理类系统,不但可以控制错误还能给出好的界面哦.

PHP系统异常处理类程序代码如下:

  1. <?php 
  2.  
  3. // 自定义异常函数 
  4. set_exception_handler('handle_exception'); 
  5.  
  6. // 自定义错误函数 
  7. set_error_handler('handle_error'); 
  8.  
  9. /** 
  10.  * 异常处理 
  11.  * 
  12.  * @param mixed $exception 异常对象 
  13.  * @author www.phpfensi.com 
  14.  */ 
  15. function handle_exception($exception) { 
  16.  Error::exceptionError($exception); 
  17.  
  18. /** 
  19.  * 错误处理 
  20.  * 
  21.  * @param string $errNo 错误代码 
  22.  * @param string $errStr 错误信息 
  23.  * @param string $errFile 出错文件 
  24.  * @param string $errLine 出错行 
  25.  * @author www.phpfensi.com 
  26.  */ 
  27. function handle_error($errNo$errStr$errFile$errLine) { 
  28.  if ($errNo) { 
  29.   Error::systemError($errStr, false, true, false); 
  30.  } 
  31.  
  32. /** 
  33.  * 系统错误处理 
  34.  * 
  35.  * @author www.phpfensi.com 
  36.  */ 
  37. class Error { 
  38.  
  39.  public static function systemError($message$show = true, $save = true, $halt = true) { 
  40.  
  41.   list($showTrace$logTrace) = self::debugBacktrace(); 
  42.  
  43.   if ($save) { 
  44.    $messageSave = '<b>' . $message . '</b><br /><b>PHP:</b>' . $logTrace
  45.    self::writeErrorLog($messageSave); 
  46.   } 
  47.  
  48.   if ($show) { 
  49.    self::showError('system'"<li>$message</li>"$showTrace, 0); 
  50.   } 
  51.  
  52.   if ($halt) { 
  53.    exit(); 
  54.   } else { 
  55.    return $message
  56.   } 
  57.  } 
  58.  
  59.  /** 
  60.   * 代码执行过程回溯信息 
  61.   * 
  62.   * @static 
  63.   * @access public 
  64.   */ 
  65.  public static function debugBacktrace() { 
  66.   $skipFunc[] = 'Error->debugBacktrace'
  67.  
  68.   $show = $log = ''
  69.   $debugBacktrace = debug_backtrace(); 
  70.   ksort($debugBacktrace); 
  71.   foreach ($debugBacktrace as $k => $error) { 
  72.    if (!isset($error['file'])) { 
  73.     // 利用反射API来获取方法/函数所在的文件和行数 
  74.     try { 
  75.      if (isset($error['class'])) { 
  76.       $reflection = new ReflectionMethod($error['class'], $error['function']); 
  77.      } else { 
  78.       $reflection = new ReflectionFunction($error['function']); 
  79.      } 
  80.      $error['file'] = $reflection->getFileName(); 
  81.      $error['line'] = $reflection->getStartLine(); 
  82.     } catch (Exception $e) { 
  83.      continue
  84.     } 
  85.    } 
  86.  
  87.    $file = str_replace(SITE_PATH, ''$error['file']); 
  88.    $func = isset($error['class']) ? $error['class'] : ''
  89.    $func .= isset($error['type']) ? $error['type'] : ''
  90.    $func .= isset($error['function']) ? $error['function'] : ''
  91.    if (in_array($func$skipFunc)) { 
  92.     break
  93.    } 
  94.    $error['line'] = sprintf('%04d'$error['line']); 
  95.  
  96.    $show .= '<li>[Line: ' . $error['line'] . ']' . $file . '(' . $func . ')</li>'
  97.    $log .= !emptyempty($log) ? ' -> ' : ''
  98.    $log .= $file . ':' . $error['line']; 
  99.   } 
  100.   return array($show$log); 
  101.  } 
  102.  
  103.  /** 
  104.   * 异常处理 
  105.   * 
  106.   * @static 
  107.   * @access public 
  108.   * @param mixed $exception 
  109.   */ 
  110.  public static function exceptionError($exception) { 
  111.   if ($exception instanceof DbException) { 
  112.    $type = 'db'
  113.   } else { 
  114.    $type = 'system'
  115.   } 
  116.   if ($type == 'db') { 
  117.    $errorMsg = '(' . $exception->getCode() . ') '
  118.    $errorMsg .= self::sqlClear($exception->getMessage(), $exception->getDbConfig()); 
  119.    if ($exception->getSql()) { 
  120.     $errorMsg .= '<div class="sql">'
  121.     $errorMsg .= self::sqlClear($exception->getSql(), $exception->getDbConfig()); 
  122.     $errorMsg .= '</div>'
  123.    } 
  124.   } else { 
  125.    $errorMsg = $exception->getMessage(); 
  126.   } 
  127.   $trace = $exception->getTrace(); 
  128.   krsort($trace); 
  129.   $trace[] = array('file' => $exception->getFile(), 'line' => $exception->getLine(), 'function' => 'break'); 
  130.   $phpMsg = array(); 
  131.   foreach ($trace as $error) { 
  132.    if (!emptyempty($error['function'])) { 
  133.     $fun = ''
  134.     if (!emptyempty($error['class'])) { 
  135.      $fun .= $error['class'] . $error['type']; 
  136.     } 
  137.     $fun .= $error['function'] . '('
  138.     if (!emptyempty($error['args'])) { 
  139.      $mark = ''
  140.      foreach ($error['args'as $arg) { 
  141.       $fun .= $mark
  142.       if (is_array($arg)) { 
  143.        $fun .= 'Array'
  144.       } elseif (is_bool($arg)) { 
  145.        $fun .= $arg ? 'true' : 'false'
  146.       } elseif (is_int($arg)) { 
  147.        $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? $arg : '%d'
  148.       } elseif (is_float($arg)) { 
  149.        $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? $arg : '%f'
  150.       } else { 
  151.        $fun .= (defined('SITE_DEBUG') && SITE_DEBUG) ? ''' . htmlspecialchars(substr(self::clear($arg), 0, 10)) . (strlen($arg) > 10 ? ' ...' : '') . ''' : '%s'
  152.       } 
  153.       $mark = ', '
  154.      } 
  155.     } 
  156.     $fun .= ')'
  157.     $error['function'] = $fun
  158.    } 
  159.    if (!isset($error['line'])) { 
  160.     continue
  161.    } 
  162.    $phpMsg[] = array('file' => str_replace(array(SITE_PATH, '\'), array('', '/'), $error['file']), 'line' => $error['line'], 'function' => $error['function']); 
  163.   } 
  164.   self::showError($type$errorMsg$phpMsg); 
  165.   exit(); 
  166.  } 
  167.  
  168.  /** 
  169.   * 记录错误日志 
  170.   * 
  171.   * @static 
  172.   * @access public 
  173.   * @param string $message 
  174.   */ 
  175.  public static function writeErrorLog($message) { 
  176.  
  177.   return false; // 暂时不写入 www.phpfensi.com 
  178.  
  179.   $message = self::clear($message); 
  180.   $time = time(); 
  181.   $file = LOG_PATH . '/' . date('Y.m.d') . '_errorlog.php'
  182.   $hash = md5($message); 
  183.  
  184.   $userId = 0; 
  185.   $ip = get_client_ip(); 
  186.  
  187.   $user = '<b>User:</b> userId=' . intval($userId) . '; IP=' . $ip . '; RIP:' . $_SERVER['REMOTE_ADDR']; 
  188.   $uri = 'Request: ' . htmlspecialchars(self::clear($_SERVER['REQUEST_URI'])); 
  189.   $message = "<?php exit;?> {$time} $message $hash $user $uri "
  190.  
  191.   // 判断该$message是否在时间间隔$maxtime内已记录过,有,则不用再记录了 
  192.   if (is_file($file)) { 
  193.    $fp = @fopen($file'rb'); 
  194.    $lastlen = 50000;  // 读取最后的 $lastlen 长度字节内容 
  195.    $maxtime = 60 * 10;  // 时间间隔:10分钟 
  196.    $offset = filesize($file) - $lastlen
  197.    if ($offset > 0) { 
  198.     fseek($fp$offset); 
  199.    } 
  200.    if ($data = fread($fp$lastlen)) { 
  201.     $array = explode(" "$data); 
  202.     if (is_array($array)) 
  203.      foreach ($array as $key => $val) { 
  204.       $row = explode(" "$val); 
  205.       if ($row[0] != '<?php exit;?>') { 
  206.        continue
  207.       } 
  208.       if ($row[3] == $hash && ($row[1] > $time - $maxtime)) { 
  209.        return
  210.       } 
  211.      } 
  212.    } 
  213.   } 
  214.  
  215.   error_log($message, 3, $file); 
  216.  } 
  217.  
  218.  /** 
  219.   * 清除文本部分字符 
  220.   * 
  221.   * @param string $message 
  222.   */ 
  223.  public static function clear($message) { 
  224.   return str_replace(array(" "" "" "), " "$message); 
  225.  } 
  226.  
  227.  /** 
  228.   * sql语句字符清理 
  229.   * 
  230.   * @static 
  231.   * @access public 
  232.   * @param string $message 
  233.   * @param string $dbConfig 
  234.   */ 
  235.  public static function sqlClear($message$dbConfig) { 
  236.   $message = self::clear($message); 
  237.   if (!(defined('SITE_DEBUG') && SITE_DEBUG)) { 
  238.    $message = str_replace($dbConfig['database'], '***'$message); 
  239.    //$message = str_replace($dbConfig['prefix'], '***', $message); 
  240.    $message = str_replace(C('DB_PREFIX'), '***'$message); 
  241.   } 
  242.   $message = htmlspecialchars($message); 
  243.   return $message
  244.  } 
  245.  
  246.  /** 
  247.   * 显示错误 
  248.   * 
  249.   * @static 
  250.   * @access public 
  251.   * @param string $type 错误类型 db,system 
  252.   * @param string $errorMsg 
  253.   * @param string $phpMsg 
  254.   */ 
  255.  public static function showError($type$errorMsg$phpMsg = '') { 
  256.   global $_G
  257.  
  258.   $errorMsg = str_replace(SITE_PATH, ''$errorMsg); 
  259.   ob_end_clean(); 
  260.   $host = $_SERVER['HTTP_HOST']; 
  261.   $title = $type == 'db' ? 'Database' : 'System'
  262.   echo <<<EOT 
  263. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  264. <html> 
  265. <head> 
  266.  <title>$host - $title Error</title> 
  267.  <meta http-equiv="Content-Type" content="text/html; charset={$_G['config']['output']['charset']}" /> 
  268.  <meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /> 
  269.  <style type="text/css"
  270.  <!-- 
  271.  body { background-color: white; color: black; font: 9pt/11pt verdana, arial, sans-serif;} 
  272.  #container {margin: 10px;} 
  273.  #message {width: 1024px; color: black;} 
  274.  .red {color: red;} 
  275.  a:link {font: 9pt/11pt verdana, arial, sans-serif; color: red;} 
  276.  a:visited {font: 9pt/11pt verdana, arial, sans-serif; color: #4e4e4e;} 
  277.  h1 {color: #FF0000; font: 18pt "Verdana"; margin-bottom: 0.5em;} 
  278.  .bg1 {background-color: #FFFFCC;} 
  279.  .bg2 {background-color: #EEEEEE;} 
  280.  .table {background: #AAAAAA; font: 11pt Menlo,Consolas,"Lucida Console"
  281.  .info { 
  282.   background: none repeat scroll 0 0 #F3F3F3; 
  283.   border: 0px solid #aaaaaa; 
  284.   border-radius: 10px 10px 10px 10px; 
  285.   color: #000000; 
  286.   font-size: 11pt; 
  287.   line-height: 160%; 
  288.   margin-bottom: 1em; 
  289.   padding: 1em; 
  290.  } 
  291.  
  292.  .help { 
  293.   background: #F3F3F3; 
  294.   border-radius: 10px 10px 10px 10px; 
  295.   font: 12px verdana, arial, sans-serif; 
  296.   text-align: center; 
  297.   line-height: 160%; 
  298.   padding: 1em; 
  299.  } 
  300.  
  301.  .sql { 
  302.   background: none repeat scroll 0 0 #FFFFCC; 
  303.   border: 1px solid #aaaaaa; 
  304.   color: #000000; 
  305.   font: arial, sans-serif; 
  306.   font-size: 9pt; 
  307.   line-height: 160%; 
  308.   margin-top: 1em; 
  309.   padding: 4px; 
  310.  } 
  311.  --> 
  312.  </style> 
  313. </head> 
  314. <body> 
  315. <div id="container"
  316. <h1>$title Error</h1> 
  317. <div class='info'>$errorMsg</div> 
  318. EOT; 
  319.   if (!emptyempty($phpMsg)) { 
  320.    echo '<div class="info">'
  321.    echo '<p><strong>PHP Debug</strong></p>'
  322.    echo '<table cellpadding="5" cellspacing="1" width="100%" class="table"><tbody>'
  323.    if (is_array($phpMsg)) { 
  324.     echo '<tr class="bg2"><td>No.</td><td>File</td><td>Line</td><td>Code</td></tr>'
  325.     foreach ($phpMsg as $k => $msg) { 
  326.      $k++; 
  327.      echo '<tr class="bg1">'
  328.      echo '<td>' . $k . '</td>'
  329.      echo '<td>' . $msg['file'] . '</td>'
  330.      echo '<td>' . $msg['line'] . '</td>'
  331.      echo '<td>' . $msg['function'] . '</td>'
  332.      echo '</tr>'
  333.     } 
  334.    } else { 
  335.     echo '<tr><td><ul>' . $phpMsg . '</ul></td></tr>'
  336.    } 
  337.    echo '</tbody></table></div>'
  338.   } 
  339.   echo <<<EOT 
  340. </div> 
  341. </body> 
  342. </html> 
  343. EOT; 
  344.   exit(); 
  345.  } 
  346.  
  347. /** 
  348.  * DB异常类 
  349.  * 
  350.  * @author www.phpfensi.com 
  351.  */ 
  352. class DbException extends Exception { 
  353.  
  354.  protected $sql
  355.  protected $dbConfig// 当前数据库配置信息 
  356.  
  357.  public function __construct($message$code = 0, $sql = ''$dbConfig = array()) { 
  358.   $this->sql = $sql
  359.   $this->dbConfig = $dbConfig
  360.   parent::__construct($message$code); 
  361.  }//开源代码phpfensi.com 
  362.  
  363.  public function getSql() { 
  364.   return $this->sql; 
  365.  } 
  366.  
  367.  public function getDbConfig() { 
  368.   return $this->dbConfig; 
  369.  } 
  370. ?>

Tags: PHP系统异常 PHP异常处理

分享到: