文档章节

PHP异常的捕获及处理

PHP开发工程师
 PHP开发工程师
发布于 2016/08/13 16:02
字数 666
阅读 23
收藏 0
点赞 0
评论 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

PHP错误和异常详解(PHP7错误处理)

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

charley158 ⋅ 03/30 ⋅ 0

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

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

雍雍_yoyo ⋅ 2013/01/31 ⋅ 0

PHP 的异常处理、错误的抛出及错误回调函数

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

欣儿 ⋅ 2013/11/18 ⋅ 0

PHP核心技术与最佳实践 读书笔记 第一章面向对象思想的核心概念

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

lilugirl ⋅ 2013/06/08 ⋅ 0

PHP中一个错误的一生

一,错误的触发 错误的触发方式有: 系统触发错误(比如有未捕获的异常,或参数类型不正确) 用户触发错误trigger_error 特别地,setexceptionhandler是用于未捕获异常的自动处理函数,如果注...

小宏的爹 ⋅ 2012/10/24 ⋅ 0

php 异常和错误处理机制

php只有手动抛出异常才能捕获异常 运行图 自定义 异常处理函数(只能捕获到异常和非致命的错误,致命的错误还是会挂掉) 运行图: 简单处理fetal error的错误 运行图:

eatnothing ⋅ 2015/10/23 ⋅ 0

Zephir-异常处理

Zephir异常处理异常处理 异常处理机制 Zephir可以处理低级的异常,提供跟PHP类似的函数式异常处理方法。当一个异常被抛出时,需要使用一个catch语句来捕获错误并允许用户自由处理错误。 Zeph...

碳素云信息技术 ⋅ 2016/03/05 ⋅ 0

调试--几种调试php的方法

一 , 使用PHP内置的异常处理类 参考php手册: try catch throw Exception抛出异常 php异常处理程序应当包括: Throw - 定义异常:在程序需要的位置定义触发异常满足的条件; (if( xx ) { th...

麦田兔子 ⋅ 2013/04/24 ⋅ 0

PHP的日志记录-错误与异常记录

PHP的日志记录-错误与异常记录 提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志、error 日志以及 PHP 的 error 日志。虽然看起来是个很简单的问题,但里面其实又...

丶辉 ⋅ 2016/08/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 44分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 55分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 今天 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部