错误和异常 (二):异常基础知识
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函数。
本作品采用《CC 协议》,转载必须注明作者和本文链接
图片挂了
图片挂了