php异常及错误信息捕获并记录日志实现方法全解析
一、php异常处理
什么是异常?
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
1、当前代码状态被保存
2、代码执行被切换到预定义的异常处理器函数
3、根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 “Uncaught Exception” (未捕获异常)的错误消息。
php系统自带异常处理:Exception
- header(“Content-type:text/html;charset=utf-8”);
- try
- {
- //业务处理 错误时抛出异常。
- $age = 130;
- if ($age > 120) {
- throw new Exception(‘代码学堂www.uxuew.cn。’,888);
- }
- }catch (Exception $e) {
- $err = [
- ‘code’ => $e->getCode(),
- ‘msg’ => $e->getMessage(),
- ‘file’ => $e->getFile(),
- ‘line’ => $e->getLine()
- ];
- echo json_encode($err);
- }
- //输出:{“code”:888,“msg”:“\u5e74\u9f84\u4e0d\u80fd\u5927\u4e8e120\u5c81\u3002”,“file”:“\/ceshi.php”,“line”:11}
php自定义异常处理:
- header(“Content-type:text/html;charset=utf-8”);
- class proException extends Exception
- {
- //根据业务需求,自定义方法
- /**
- * 获取错误信息
- * @param int $type 类型 1=json 2=数组
- * @return array
- */
- public function getErrorInfo($type = 2)
- {
- $err = [
- ‘code’ => $this->getCode(),
- ‘msg’ => $this->getMessage(),
- ‘file’ => $this->getFile(),
- ‘line’ => $this->getLine()
- ];
- if ($type == 1) {
- return json_encode($err);
- }
- return $err;
- }
- }
- try
- {
- //业务处理 错误时抛出异常。
- $site =$_SERVER[‘HTTP_HOST’] ;
- if ($site == ‘www.uxuew.cn‘) {
- throw new proException(‘代码学堂官网’,999);
- }
- } catch (proException $e) {
- $info = $e->getErrorInfo();
- var_dump($info);
- }
- 输出:array(4){[“code”]=>int(999) [“msg”]=>string(27)“代码学堂官网“ [“file”]=>string(17) “/ceshi.php” [“line”]=>int(53)}
php还可以捕捉多个异常
- header(“Content-type:text/html;charset=utf-8”);
- class proException extends Exception
- {
- //根据业务需求,自定义错误方法
- /**
- * 获取错误信息
- * @param int $type 类型 1=json 2=数组
- * @return array
- */
- public function getErrorInfo($type = 2)
- {
- $err = [
- ‘code’ => $this->getCode(),
- ‘msg’ => $this->getMessage(),
- ‘file’ => $this->getFile(),
- ‘line’ => $this->getLine()
- ];
- if ($type == 1) {
- return json_encode($err);
- }
- return $err;
- }
- }
- try
- {
- if ($_GET[‘age’] > 100) {
- throw new proException(‘自定义的异常处理’, 1002);
- } else {
- throw new Exception(‘系统的异常处理’, 1002);
- }
- } catch (proException $e) {
- $info = $e->getErrorInfo();
- var_dump($info);//自定义异常处理
- } catch (Exception $e) {
- echo $e->getMessage();//系统异常处理
- }
设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数
- function myException($exception)
- {
- echo “Exception: “ , $exception->getMessage();
- }
- set_exception_handler(‘myException’);
- throw new Exception(‘Uncaught Exception occurred’);
- ?>
在上面的代码中,不存在 “catch” 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。
二、php错误处理
在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
如果在本地
程序调试时
出现系统致命性错误可以设置
error_reporting(E_ALL)
来显示所有错误信息
,但在服务器中我们是不能这样做的,这样很容易暴露系统信息,那么我们要如何处理系统错误呢
1、我们可以自定义系统报错函数:
set_error_handler(
‘errorHandler’,
E_ALL | E_STRICT
)
//设置错误处理器函数
errorHandler
,可以配合error_log函数实现日志记录功能
参数:
errorhandler 必需。规定用户错误处理函数的名称。
E_ALL|E_STRICT 可选。规定显示何种错误报告级别的用户定义错误。默认是 “E_ALL”。
注:
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错,在通常情况下不会发生
使用set_error_handler()后,error_reporting()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。
2、捕获系统致命性错误:
error_get_last()
//获取最后一次发生错误信息;
register_shutdown_function(‘fatalErrorHandler’) //在脚本停止执行时注册一个回调函数
注:通过以上两个函数我们用可以监控系统致命性错误,比如服务器500错误,然后并记录到日志文件中
代码实例:
- //禁止错误输出
- error_reporting(0);
- //设置错误处理器
- set_error_handler(‘errorHandler’);
- //在脚本结束时运行的函数
- register_shutdown_function(‘fatalErrorHandler’);
- /**
- * 错误处理
- * @param int $err_no 错误代码
- * @param string $err_msg 错误信息
- * @param string $err_file 错误文件
- * @param int $err_line 错误行号
- * @return string
- */
- function errorHandler($err_no = 0, $err_msg = ”, $err_file = ”, $err_line = 0)
- {
- $log = [
- ‘[‘.date(‘Y-m-d h-i-s’).‘]’,
- ‘|’,
- $err_no,
- ‘|’,
- $err_msg,
- ‘|’,
- $err_file,
- ‘|’,
- $err_line
- ];
- $log_path = ‘/data/mi/test.txt’;
- error_log(implode(‘ ‘,$log).“\r\n”,3, $log_path);
- //echo implode(‘ ‘,$log).””;
- }
- /**
- * 捕捉致命错误
- * @return string
- */
- function fatalErrorHandler() {
- $e = error_get_last();
- switch ($e[‘type’]) {
- case 1:
- errorHandler($e[‘type’], $e[‘message’], $e[‘file’], $e[‘line’]);
- break;
- }
- }
- class DemoClass_1
- {
- public function index()
- {
- //这里发生一个警告错误,出发errorHandler
- echo $undefinedVarible;
- }
- }
- $demo_1 = new DemoClass_1();
- //这里发生一个警告错误,被errorHandler 捕获
- $demo_1->index();
- //发生致命错误,脚本停止运行触发 fatalErrorHandler
- $demo_2 = new DemoClass_2();
- $demo_2->index();
打开echo后 输出:
[2016-08-07 09-01-34] | 8 | Undefined variable: undefinedVarible | /data/mi/demo.php | 126
[2016-08-07 09-01-34] | 1 | Class ‘DemoClass_2’ not found | /data/mi/demo.php | 134
备注:
1. register_shutdown_function 也可以用于API调试中,记录每次请求值和返回值,方便调试。
2. 利用 “|” 分割的好处是,便于利用 awk 对日志进行分割处理。
转载请注明:代码学堂>编程开发 > php教程 > php异常及错误信息捕获并记录日志实现方法全解析
2. 本站不保证所提供所有下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有RB奖励和额外RMB收入!
磊宇堂正在使用的服务器 维护管理由磊宇云服务器提供支持
磊宇堂 » php异常及错误信息捕获并记录日志实现方法全解析