当前位置: 首页 > web开发 > PHP > 正文

php异常处理

时间:2017-01-05 本站 guaitu

异常处理的作用

异常处理用于在指定的错误(异常)情况发生时,改变脚本的正常流程。

异常处理的基本语法:

try{
//可能出现的错误(异常)的代码
}
catch(Exception e){
//捕获异常并处理,通常情况下是抛出一个异常
throwe;
}

实际需求,有一个函数,需要addUser()和updUser()同时成功才算成功:

function A(){

addUser(); //想知道addUser()函数是否执行成功,如何处理?

updUser(); //想知道updUser()函数是否执行成功,如何处理?

}

如何解决?

(1)使用传统方法,通过返回值确定;

<?php
//添加用法
//需要addUser()和updUser()都成功
function addUser($username){
if($username=="小张"){
//添加成功
return true;
}else{
//失败
return false;
}
}
function updUser($username){
if($username=="小李"){
//添加成功
return true;
}else{
//失败
return false;
}
}
function A(){
//调用方法,添加用户
$res1=addUser("www.bianceng.cn");
//调用方法,修改用户
$res2=updUser("hello");
if($res1 && $res2){
echo "修改成功";
}else{
echo "修改失败";
}
}
A();
?>

(2)如何使用异常处理机制?

<?php
/* //添加用法
//需要addUser()和updUser()都成功
function addUser($username){
if($username=="小张"){
//添加成功
return true;
}else{
//失败
return false;
}
}
function updUser($username){
if($username=="小李"){
//添加成功
return true;
}else{
//失败
return false;
}
}
function A(){
//调用方法,添加用户
$res1=addUser("www.bianceng.cn");
//调用方法,修改用户
$res2=updUser("hello");
if($res1 && $res2){
echo "修改成功";
}else{
echo "修改失败";
}
}
A();
*/
try{
addUser("小张");
updUser("hello");
}
//catch:捕获的意思;Exception是php事先定好的异常类
catch(Exception $e){
echo "失败信息=".$e->getMessage();
}
function addUser($username){
if($username=="小张"){
//添加成功
}else{
//失败 抛出异常
throw new Exception("添加失败");
}
}
function updUser($username){
if($username=="小李"){
//添加成功
}else{
//失败 抛出异常
throw new Exception("更新失败");
}
}
?>

异常使用的注意事项:

通过上例,可以看出,使用

try{
//可能出现的错误(异常)的代码
}
catch(Exception e){
//捕获异常并处理,通常情况下是抛出一个异常
throwe;
}

这种方式可更有效的控制错误,所以在开发中大量使用。

异常的基本处理

当异常被抛出时,try()块里的后续的代码不会继续执行,PHP会尝试查找匹配的“catch”代码块。如果一个异常发生,但没有catch捕获,会提示一个Uncatched Exception

<?php
function checkNum($val){
if($val>100){
throw new Exception("error_no1:数值过大");
}else{
echo "输入的值是正常的";
}
}
try{
checkNum(300);
}catch(Exception $e){
echo $e->getMessage()."--第".$e->getLine()."行";
}
?>

当catch一个异常后,可以处理,也可以不处理可以继续抛出(throw new exception("信息");)。

例:显示错误的行数

<?php
function checkNum($val){
if($val>100){
throw new Exception("error_no1:数值过大");
}else{
echo "输入的值是正常的";
}
}
try{
checkNum(300);
}catch(Exception $e){
echo $e->getMessage()."--第".$e->getLine()."行";
}
?>

也可以自定义异常处理类,来代替系统默认的顶级异常处理器:

<?php
set_exception_handler("my_exception"); //修改默认的顶级异常处理器
//自定义顶级异常处理器
function my_exception($e){
echo "我自定义的顶级异常处理器".$e->getMessage();
}
function checkNum($val){
if($val>100){
throw new Exception("error_no1:数值过大");
}else{
echo "输入的值是正常的";
}
}
try{
checkNum(300);
}catch(Exception $e){
//echo $e->getMessage()."--第".$e->getLine()."行";
//继续抛出,此时将会启动php默认的异常处理器来处理,也可以自定义顶级异常处理器来处理
throw $e;
}
?>

使用多个catch代码块,可以捕获不同种类的异常

<?php
//自定义了一个异常
class MyException1 extends Exception{//继承默认异常
}
class MyException2 extends Exception{
}
function A(){
throw new MyException1(a);
}
function B(){
throw new MyException2(b);
}
function C(){
try{
A(); //抛出MyException1
B(); //抛出MyException2
}catch(Exception1 $e1){
echo $e1->getMessage();
}catch(Exception2 $e2){
echo $e2->getMessage();
}
}
?>

PHP中有些异常是无法捕获的,只能由系统异常处理器来处理。能不能catch到异常,取决于有没有真的抛出异常。

例:

<?php
try{
//$i=10/0;
$fp=fopen("abc.txt","r"); //无法抛出,由系统异常处理器来处理
}catch(Exception $e){
echo "ok"."<br />"; //这两行代码并没有执行,原因是try块里的代码并没有抛出异常
echo $e->getMessage();
}
?>

URL: http://www.bianceng.cn/webkf/PHP/201701/50512.htm