異常處理的作用
異常處理用於在指定的錯誤(異常)情況發生時,改變腳本的正常流程。
異常處理的基本語法:
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