资讯专栏INFORMATION COLUMN

PHP异常的捕获及处理

GHOST_349178 / 1936人阅读

摘要:系统自带异常处理业务处理错误时抛出异常。输出自定义异常处理根据业务需求,自定义方法获取错误信息类型数组业务处理错误时抛出异常。年龄不能大于岁。利用分割的好处是,便于利用对日志进行分割处理。

系统自带异常处理

 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":"u5e74u9f84u4e0du80fdu5927u4e8e120u5c81u3002","file":"/data/mi/demo.php","line":11}

自定义异常处理

 $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) }

捕捉多个异常

 $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)."
",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

备注:

register_shutdown_function 也可以用于API调试中,记录每次请求值和返回值,方便调试。

利用 “|” 分割的好处是,便于利用 awk 对日志进行分割处理。

Thanks ~

AD:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21849.html

相关文章

  • PHP 错误与异常

    摘要:但异常捕获后程序可以继续执行,而真正的错误出现后程序就必须终止异常可以使用来捕获捕获,捕获之后后续代码可以继续执行而错误是无法使用捕获的如果抛出了异常,就必须捕获它否则程序终止执行。 PHP错误级别 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低级别的错误(不推荐,不建议)使用一些过期函数的...

    longmon 评论0 收藏0
  • Generator 异常处理

    摘要:的方法在中,提供了方法来抛出异常。总结关于生成器的异常处理,这里来进行一下总结。最近在研究使用实现半协程,而这个过程中,对异常的处理,是非常重要的。但是的运行方式决定了异常处理比较难以理解。 本文是我在研究 PHP 异步编程时的总结。对于相当多的 PHPer 来说,可能都不知道 Generator,或者对 Generaotr 的流程不是很熟悉。因为 Generator 使得程序不再是顺...

    Bmob 评论0 收藏0
  • PHP框架中日志系统

    摘要:一的几个函数异常捕获自定义处理函数注册错误捕获自定义处理函数注册程序执行时异常终止错误捕获处理函数注册这三个函数在错误处理控制中给开发者提供了很大的自主空间,在日志系统中记录日志信息有他们的功劳。下面要说的类库是借鉴了日志系统的设计。 引言 接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程...

    ningwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<