• 我们中的有些人,注定要在日常生活的点滴中去寻找生命的意义。---- 《生活大爆炸》|

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

PHP admin 来源:错误和异常(二):异常基础知识 8个月前 (02-01) 101次浏览 已收录 0个评论

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

思维导图:

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();
    }

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函数。

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


本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:错误和异常 (二):异常基础知识
喜欢 (0)

您必须 登录 才能发表评论!