文档章节

PHP异常的捕获及处理

PHP开发工程师
 PHP开发工程师
发布于 2016/08/13 16:02
字数 666
阅读 25
收藏 0
PHP

系统自带异常处理

<?php
header("Content-type:text/html;charset=utf-8");
try
{
    //业务处理 错误时抛出异常。
    $age = 130;
    if ($age > 120) {
        throw new Exception('年龄不能大于120岁。', 1001);
    }
} catch (Exception $e) {
    $err = [
        'code' => $e->getCode(),
        'msg'  => $e->getMessage(),
        'file'    => $e->getFile(),
        'line'   => $e->getLine()
    ];
    echo json_encode($err);
}

输出:{"code":1001,"msg":"\u5e74\u9f84\u4e0d\u80fd\u5927\u4e8e120\u5c81\u3002","file":"\/data\/mi\/demo.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
{
    //业务处理 错误时抛出异常。
    $age = 130;
    if ($age > 120) {
        throw new proException('年龄不能大于120岁。', 1001);
    }
} catch (proException $e) {
    $info = $e->getErrorInfo();
    var_dump($info);
}

输出:array(4) { ["code"]=> int(1001) ["msg"]=> string(27) "年龄不能大于120岁。" ["file"]=> string(17) "/data/mi/demo.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();
}

?age=110 输出:array(4) { ["code"]=> int(1002) ["msg"]=> string(24) "自定义的异常处理" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(64) }
?age=20 输出:系统的异常处理。

日志记录

//禁止错误输出
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)."<br>";
}

/**
 * 捕捉致命错误
 * @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

备注:

  • register_shutdown_function 也可以用于API调试中,记录每次请求值和返回值,方便调试。
  • 利用 “|” 分割的好处是,便于利用 awk 对日志进行分割处理。

Thanks ~

PHP工程师

© 著作权归作者所有

共有 人打赏支持
PHP开发工程师
粉丝 0
博文 3
码字总数 2239
作品 0
朝阳
高级程序员
PHP 完善的 Error / Exception 的捕获与处理

PHP(PHP_VERSION >= 7) 的 Error / Exception 的捕获与处理还是值得一说的,优雅处理错误与异常,在提升框架友好度的同时,也提升了开发效率。 PHP 错误等级 以上为 PHP 的一些错误监听级别...

big_cat
05/22
0
0
PHP错误和异常详解(PHP7错误处理)

世界上没有绝对完美的事,对于程序员来说更是如此,无论我们多么努力、多么细心的开发一个项目,总会有缺陷和错误的存在。 错误和异常的异同 "错误"和"异常"的概念十分相似,很容易混淆,"错...

charley158
03/30
0
0
贝尔的技术博客 cnbeir@163.com PHP中的错误处理、异常处理机制

在编写php程序时,错误处理是一个重要的部分。如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判...

雍雍_yoyo
2013/01/31
0
0
PHP 的异常处理、错误的抛出及错误回调函数

一、错误、异常 等级常量表 error:不能在编译期发现的运行期错误,不如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断; exception:程序执行过程中...

欣儿
2013/11/18
0
0
PHP核心技术与最佳实践 读书笔记 第一章面向对象思想的核心概念

第一章 面向对象思想的核心概念 面向对象程序设计是一种程序设计范型,同时也是一种程序开发方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和可扩展性...

lilugirl
2013/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA中Maven打包时如何跳过测试

方法1:直接使用IDEA提供的方式 Maven命令栏的工具栏有下图中的图标,上面就写着 Skip Tests 按下图标后,如下图,test就不可用了 直接使用package命令即可。 方法2:自己编辑maven命令 进入...

karma123
5分钟前
0
0
Device eth0 does not seem to be present,delaying initialization.

场景:在进行linux 主机克隆的时候,网卡初始化一般都会有问题,最常见的“Device eth0 does not seem to be present,delaying initialization.”,从字面意思 说eth0没有固化,延迟启动。由...

hnairdb
5分钟前
0
0
国内首个区块链试验区在海南成立

据新华社报道,10月8日,海南自贸区(港)区块链试验区正式在海南生态软件园授牌设立,这也是目前为止国内第一个区块链试验区。 该试验区位于海南生态软件园,与试验区同一天成立还有2家研究...

linuxCool
17分钟前
0
0
Java日期和时间获取问题

获取年月日时分秒 Calendar cal = Calendar.getInstance();//获取年int year = cal.get(Calendar.YEAR);//获取月,范围是0-11,最后使用需+1int month = cal.get(Cal...

lanyu96
35分钟前
10
0
Ceph学习笔记2-在Kolla-Ansible中使用Ceph后端存储

环境说明 使用Kolla-Ansible请参考《使用Kolla-Ansible在CentOS 7单节点上部署OpenStack Pike》; 部署Ceph服务请参考《Ceph学习笔记1-Mimic版本多节点部署》。 配置Ceph 以osdev用户登录: ...

LastRitter
39分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部