程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php異常處理

php異常處理

編輯:PHP綜合

異常處理的作用

異常處理用於在指定的錯誤(異常)情況發生時,改變腳本的正常流程。

異常處理的基本語法:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved