热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP系统异常处理类程序

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

' . $message . '
PHP:' . $logTrace; self::writeErrorLog($messageSave); } if ($show) { self::showError('system', "
  • $message
  • ", $showTrace, 0); } if ($halt) { exit(); } else { return $message; } } /** * 代码执行过程回溯信息 * * @static * @access public */ public static function debugBacktrace() { $skipFunc[] = 'Error->debugBacktrace'; $show = $log = ''; $debugBacktrace = debug_backtrace(); ksort($debugBacktrace); foreach ($debugBacktrace as $k => $error) { if (!isset($error['file'])) { // 利用反射API来获取方法/函数所在的文件和行数 try { if (isset($error['class'])) { $reflection = new ReflectionMethod($error['class'], $error['function']); } else { $reflection = new ReflectionFunction($error['function']); } $error['file'] = $reflection->getFileName(); $error['line'] = $reflection->getStartLine(); } catch(Exception $e) { continue; } } $file = str_replace(SITE_PATH, '', $error['file']); $func = isset($error['class']) ? $error['class'] : ''; $func.= isset($error['type']) ? $error['type'] : ''; $func.= isset($error['function']) ? $error['function'] : ''; if (in_array($func, $skipFunc)) { break; } $error['line'] = sprintf('%04d', $error['line']); $show.= '
  • [Line: ' . $error['line'] . ']' . $file . '(' . $func . ')
  • '; $log.= !empty($log) ? ' -> ' : ''; $log.= $file . ':' . $error['line']; } return array( $show, $log ); } /** * 异常处理 * * @static * @access public * @param mixed $exception */ public static function exceptionError($exception) { if ($exception instanceof DbException) { $type = 'db'; } else { $type = 'system'; } if ($type == 'db') { $errorMsg = '(' . $exception->getCode() . ') '; $errorMsg.= self::sqlClear($exception->getMessage() , $exception->getDbConfig()); if ($exception->getSql()) { $errorMsg.= '

    '; $errorMsg.= self::sqlClear($exception->getSql() , $exception->getDbConfig()); $errorMsg.= '

    &#39;; } } else { $errorMsg = $exception->getMessage(); } $trace = $exception->getTrace(); krsort($trace); $trace[] = array( &#39;file&#39; => $exception->getFile() , &#39;line&#39; => $exception->getLine() , &#39;function&#39; => &#39;break&#39; ); $phpMsg = array(); foreach ($trace as $error) { if (!empty($error[&#39;function&#39;])) { $fun = &#39;&#39;; if (!empty($error[&#39;class&#39;])) { $fun.= $error[&#39;class&#39;] . $error[&#39;type&#39;]; } $fun.= $error[&#39;function&#39;] . &#39;(&#39;; if (!empty($error[&#39;args&#39;])) { $mark = &#39;&#39;; foreach ($error[&#39;args&#39;] as $arg) { $fun.= $mark; if (is_array($arg)) { $fun.= &#39;Array&#39;; } elseif (is_bool($arg)) { $fun.= $arg ? &#39;true&#39; : &#39;false&#39;; } elseif (is_int($arg)) { $fun.= (defined(&#39;SITE_DEBUG&#39;) && SITE_DEBUG) ? $arg : &#39;%d&#39;; } elseif (is_float($arg)) { $fun.= (defined(&#39;SITE_DEBUG&#39;) && SITE_DEBUG) ? $arg : &#39;%f&#39;; } else { $fun.= (defined(&#39;SITE_DEBUG&#39;) && SITE_DEBUG) ? &#39;&#39;&#39; . htmlspecialchars(substr(self::clear($arg), 0, 10)) . (strlen($arg) > 10 ? &#39; . . . &#39; : &#39;&#39;) . &#39;&#39;&#39; : &#39;%s&#39;; } $mark = &#39;, &#39;; } } $fun.= &#39;)&#39;; $error[&#39;function&#39;] = $fun; } if (!isset($error[&#39;line&#39;])) { continue; } $phpMsg[] = array( &#39;file&#39; => str_replace(array( SITE_PATH, &#39;&#39; ) , array( &#39;&#39;, &#39;/&#39; ) , $error[&#39;file&#39;]) , &#39;line&#39; => $error[&#39;line&#39;], &#39;function&#39; => $error[&#39;function&#39;] ); } self::showError($type, $errorMsg, $phpMsg); exit(); } /** * 记录错误日志 * * @static * @access public * @param string $message */ public static function writeErrorLog($message) { return false; // 暂时不写入 http://www.phprm.com $message = self::clear($message); $time = time(); $file = LOG_PATH . &#39;/&#39; . date(&#39;Y.m.d&#39;) . &#39;_errorlog.php&#39;; $hash = md5($message); $userId = 0; $ip = get_client_ip(); $user = &#39;User: userId=&#39; . intval($userId) . &#39;; IP=&#39; . $ip . &#39;; RIP:&#39; . $_SERVER[&#39;REMOTE_ADDR&#39;]; $uri = &#39;Request: &#39; . htmlspecialchars(self::clear($_SERVER[&#39;REQUEST_URI&#39;])); $message = " {$time} $message $hash $user $uri "; // 判断该$message是否在时间间隔$maxtime内已记录过,有,则不用再记录了 if (is_file($file)) { $fp = @fopen($file, &#39;rb&#39;); $lastlen = 50000; // 读取最后的 $lastlen 长度字节内容 $maxtime = 60 * 10; // 时间间隔:10分钟 $offset = filesize($file) - $lastlen; if ($offset > 0) { fseek($fp, $offset); } if ($data = fread($fp, $lastlen)) { $array = explode(" ", $data); if (is_array($array)) foreach ($array as $key => $val) { $row = explode(" ", $val); if ($row[0] != &#39;&#39;) { continue; } if ($row[3] == $hash && ($row[1] > $time - $maxtime)) { return; } } } } error_log($message, 3, $file); } /** * 清除文本部分字符 * * @param string $message */ public static function clear($message) { return str_replace(array( " ", " ", " " ) , " ", $message); } /** * sql语句字符清理 * * @static * @access public * @param string $message * @param string $dbConfig */ public static function sqlClear($message, $dbConfig) { $message = self::clear($message); if (!(defined(&#39;SITE_DEBUG&#39;) && SITE_DEBUG)) { $message = str_replace($dbConfig[&#39;database&#39;], &#39;***&#39;, $message); //$message = str_replace($dbConfig[&#39;prefix&#39;], &#39;***&#39;, $message); $message = str_replace(C(&#39;DB_PREFIX&#39;) , &#39;***&#39;, $message); } $message = htmlspecialchars($message); return $message; } /** * 显示错误 * * @static * @access public * @param string $type 错误类型 db,system * @param string $errorMsg * @param string $phpMsg */ public static function showError($type, $errorMsg, $phpMsg = &#39;&#39;) { global $_G; $errorMsg = str_replace(SITE_PATH, &#39;&#39;, $errorMsg); ob_end_clean(); $host = $_SERVER[&#39;HTTP_HOST&#39;]; $title = $type == &#39;db&#39; ? &#39;Database&#39; : &#39;System&#39;; echo <<

    $title Error

    $errorMsg

    EOT; if (!empty($phpMsg)) { echo &#39;

    &#39;; echo &#39;

    PHP Debug

    &#39;; echo &#39;&#39;; if (is_array($phpMsg)) { echo &#39;&#39;; foreach ($phpMsg as $k => $msg) { $k++; echo &#39;&#39;; echo &#39;&#39;; echo &#39;&#39;; echo &#39;&#39;; echo &#39;&#39;; echo &#39;&#39;; } } else { echo &#39;&#39;; } echo &#39;
    No.FileLineCode
    &#39; . $k . &#39;&#39; . $msg[&#39;file&#39;] . &#39;&#39; . $msg[&#39;line&#39;] . &#39;&#39; . $msg[&#39;function&#39;] . &#39;
      &#39; . $phpMsg . &#39;

    &#39;; } echo << EOT; exit(); } } /** * DB异常类 * * @author www.phprm.com */ class DbException extends Exception { protected $sql; protected $dbConfig; // 当前数据库配置信息 public function __construct($message, $code = 0, $sql = &#39;&#39;, $dbCOnfig= array()) { $this->sql = $sql; $this->dbCOnfig= $dbConfig; parent::__construct($message, $code); } public function getSql() { return $this->sql; } public function getDbConfig() { return $this->dbConfig; } } ?>

    效果图:PHP系统异常处理类程序

    推荐阅读
    • 高质量SQL书写的30条建议
      本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
    • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
    • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
      本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
    • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
    • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
    • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
    • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
      本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
    • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
    • 知识图谱——机器大脑中的知识库
      本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
    • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
    • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
    • Voicewo在线语音识别转换jQuery插件的特点和示例
      本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
    • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
    • 后台获取视图对应的字符串
      1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
    • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
    author-avatar
    佳华雅惠妤坚
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有