文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 容器实现对bean的管理(注解方式解析,源码阅读)

因为最近在研究学习spring boot,所以这里想详细学习回顾了一下spring 容器对bean的一些管理方式和部分源码学习。 首先初始类AnnotationConfigApplicationContext,简单源码查看,支持两个参...

小海bug
18分钟前
0
0
数据结构:二分查找 java

二分查找的前提是有序存储,利用顺序存储和元素排序 /** * 二分查找,查找成功,返回下标记 * @param values * @param begin * @param end * @param key * @param <T> * @ret...

京一
36分钟前
0
0
@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
49分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
今天
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部