PHP-异常处理
异常是程序在执行过程中出现一个例外或一个事件,程序中断了正常的运行,跳转到程序的其它模块继续运行
PHP内置的异常处理类Exception
<?php
/**
* Author: MuT6 Sch01aR
* Date: 2018/3/17
* Time: 12:28
*/
class Exception{
protected $message = 'Unknown exception'; //异常信息
protected $code = 0; //用户自定义异常代码
protected $file; //发生异常的文件名
protected $line; //发生异常的代码行号
function __construct($message = null, $coed = 0){} //构造方法
final function getMessage(){} //返回异常信息
final function getCode(){} //返回异常代码
final function getFile(){} //返回发生异常的文件名
final function getLine(){} //返回发生异常的代码行号
final function getTrace(){} //获取异常追踪信息
final function getTraceAsString(){} //获取字符串类型的异常追踪信息
//可重载的方法
function __toString(){} //将异常对象转换为字符串
function __clone(){} //异常克隆
}
?>
实现异常处理
<?php
/**
* Author: MuT6 Sch01aR
* Date: 2018/3/14
* Time: 22:37
*/
function Guess_age($age){
if ($age > 120){
throw new Exception('年龄过大'); //需要将异常抛出
}
else{
echo '年龄无误';
}
}
try{
echo "在异常被捕捉之前+\n";
Guess_age(121);
echo '在异常被捕捉之后'; //如果遇到异常被捕捉了,就不会执行这句话
}catch(Exception $e){
echo $e->getMessage()."\n"; //打印抛出的信息
echo $e->getLine(); //打印哪一行异常
}
?>
运行结果

异常被捕捉到前的语句被执行了,异常被捕捉之后的语句没有执行
扩展异常处理类
我们可以扩展异常处理类来添加一些自定义的方法
<?php
/**
* Author: MuT6 Sch01aR
* Date: 2018/3/14
* Time: 23:38
*/
//继承父类Exception
class My_Exception extends Exception{
function getinfo() //不能改写父类中的成员方法
{
echo '这是My_Exception';
}
}
function Guess_age($age)
{
if ($age > 120) {
throw new My_Exception('年龄过大');
} else {
echo '年龄无误';
}
}
try{
Guess_age(121);
}catch(My_Exception $e){
echo $e->getinfo()."\n";
echo $e->getMessage();
}
?>
运行结果

顶级异常处理器
catch捕捉到的异常,也可以继续抛出去交给系统的顶级异常处理器来处理
也可以自己定义一个顶级异常处理函数
<?php
/**
* Author: MuT6 Sch01aR
* Date: 2018/3/14
* Time: 23:32
*/
function My_Exception($e){
echo '当前为顶级异常处理函数:'.$e->getMessage();
}
set_exception_handler('My_Exception');
function Guess_age($age){
if ($age > 120){
throw new Exception('年龄过大');
}
else{
echo '年龄无误';
}
}
try{
Guess_age(121);
}catch(Exception $e){
throw $e; //把异常抛给顶级异常处理函数来处理
}
?>
运行结果

处理多个异常
通过catch捕获多个异常,当try中抛出异常后,catch会捕捉相应的异常进行处理
<?php
/**
* Author: MuT6 Sch01aR
* Date: 2018/3/14
* Time: 23:52
*/
class My_Exception_1 extends Exception{
function getinfo() //不能改写父类中的成员方法
{
echo '这是My_Exception_1';
}
}
class My_Exception_2 extends Exception{
function getinfo() //不能改写父类中的成员方法
{
echo '这是My_Exception_2';
}
}
function Guess_Age($age){
if ($age > 120){
throw new My_Exception_1('年龄过大');
}
else{
echo '年龄无误';
}
}
function Guess_Name($name){
if ($name != 'John'){
throw new My_Exception_2('名字错误');
}else{
echo '名字正确';
}
}
try{
Guess_Age(123);
Guess_Name('Jack');
}catch(My_Exception_1 $e1){
echo $e1->getinfo().'-------'.$e1->getMessage()."\n";
}catch(My_Exception_2 $e2){
echo $e2->getinfo().'-------'.$e2->getMessage();
}
?>
运行结果

只捕捉到了第一个异常,因为try中有异常被捕捉后,后面的语句就不执行了

浙公网安备 33010602011771号