错误和异常 (二):异常基础知识

1 什么叫异常

定义:程序的行为和预期不同,是属于逻辑上错误。什么意思呢,就是按照正常逻辑来说不会出现,但却发生了的。

和错误的区别:

1 错误是由于php脚本自身的问题导致的和逻辑无关,异常则是由于逻辑问题导致的

2 在php7之前错误不能用try catch捕获,异常可以

2 系统自定义异常类

1 异常类简介
在php中,系统给我们内置好了一个Exception类,这个类是系统给我们定义好的,我们不需要去再定义异常处理类,可以直接使用。

<?php

$exception = new Exception; //直接new这个类,不需要去定义

var_dump($exception);

//打印结果:
object(Exception)#1 (7) {
  ["message":protected]=>
  string(0) ""
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(40) "D:\project\mz_php_server\public\test.php"
  ["line":protected]=>
  int(3)
  ["trace":"Exception":private]=>
  array(0) {
  }
  ["previous":"Exception":private]=>
  NULL
}

从上面的打印结果可以看出,这个类有几个受保护的属性,这些属性都是和异常有关的,解释一下这写属性的意思。

message 异常的信息

code 异常代码

file 发生异常的文件

line 发生异常的行数

那有人会问了,既然是受保护的属性,那我们怎么获取他呢,我们会在后面的try catch 里面讲解如何获取这些属性

2 异常类构造函数

要使用系统的异常处理类,就必须要了解一下这个类的构造函数

说明:

public Exception::__construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )

参数:
message
抛出的异常消息内容。

code
异常代码。

previous
异常链中的前一个异常。

从上面的说明可以看出,这是一个public 的构造函数,构造函数的参数有三个,一般工作中经常用到的是前两个,这里就解释前两个参数,想了解更多请到php手册里面去查询

message参数 抛出的异常消息,这个参数可以帮助我们设置异常类的message属性

code参数 异常代码,这个参数可以帮助我们设置异常类的code属性,这个是可以省略的参数。

3 try catch

1 try catch基础

前面的都是一些理论型的知识,是为了给后面讲解try catch铺垫,try catch就是我们工作中经常要用到的异常捕获了。接下来看一下 try catch的基本用法

<?php 

try {
    throw new Exception("大江东去,浪淘尽,千古风流人物"); //抛出异常

} catch (Exception $e) { //系统内置的异常处理类
    echo $e->getMessage(); //获取异常信息
}

throw 代表着抛出,这里必须要说一下php和一些语言是不同的,异常必须要手动抛出才行否则捕获不到。

手动抛出异常是php比较鸡肋的地方,异常必须要手动抛出,才能捕获到,但是既然已经知道哪里会发生异常,直接规避不就可以了吗? 或者重写逻辑,这可能是php比较特殊的地方吧。

$e 则是系统内置的异常处理类,$e->getMessage() 方法可以获取抛出的异常信息

2 try catch 嵌套

在php中 try catch 可以定义多个异常处理块,类似于if else的感觉

<?php

//定义一个异常处理类,继承系统的异常处理类
class TestException extends Exception{

}

$type = 2;
try {

    if($type == 1)
    {
        throw new Exception("type is 1");

    }

    if($type == 2)
    {
        throw new TestException("type is 2");

    }

} catch (Exception $e) {

    echo $e->getMessage();

} catch (TestException $e) {
    echo $e->getMessage();
}

try catch 还可以一层一层的向上抛出,和js的冒泡很像

<?php

//定义一个异常处理类,继承系统的异常处理类
class TestException extends Exception{

}

try {

    try {

        throw new TestException("我是测试嵌套的");

    } catch (Exception $e) { //捕获TestException
        throw $e; //把捕获的异常再次抛出
    }

} catch (Exception $e) { //捕获上一层抛出的TestException
    echo $e->getMessage();
}

从代码里面可以看出定义两层try catch,最里面一层的捕获了TestException,后面在catch 里面又抛出了,由上层try catch捕获

4 必会函数

set_exception_handler

系统同样给我们提供了一个自定义的异常处理函数,用来处理没有用try catch捕获的异常,如果你抛出的异常无人捕获,那么就会进入该方法

可用版本:(PHP 4 >= 4.0.1, PHP 5, PHP 7)

说明:set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。

参数解释:

exception_handler
当一个未捕获的异常发生时所调用函数的名称。 该处理函数需要接受一个参数,该参数是一个抛出的异常对象

接下来举案例来简单说明一下这个函数的用法

<?php
set_exception_handler('myexception');
function myexception($exception)
{
    var_dump($exception->getMessage());
}

throw new Exception("测试一下自定义异常处理函");

在上面我定义了一个异常处理方法myexception,然后用set_exception_handler注册了一下,然后我抛出异常,这个时候系统就会执行myexception函数。

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
maole
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
A_sneeze_is_missing

图片挂了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!