PHP 錯誤處理
1、使用 die() 函數(shù)
<?php
if(!file_exists("welcome.txt")){ //如果目標(biāo)文件不存在
die("File not found"); //給出錯誤信息
} else { //否則
$file=fopen("welcome.txt","r"); //打開目標(biāo)文件
}
?>
2送火、使用 trigger_error() 函數(shù)
在腳本中用戶輸入數(shù)據(jù)的位置烈钞,當(dāng)用戶的輸入無效時完成觸發(fā)。
<?php
$test=2;
if ($test>1){
trigger_error("Value must be 1 or below");
}
?>
3捎拯、通過使用 error_log() 函數(shù)泪幌,可以向指定的文件或遠(yuǎn)程目的地發(fā)送錯誤記錄。
PHP異常處理
當(dāng)異常被觸發(fā)時署照,通常會發(fā)生:
- 當(dāng)前代碼狀態(tài)被保存
- 代碼執(zhí)行被切換到預(yù)定義的異常處理器函數(shù)
- 根據(jù)情況祸泪,處理器也許會從保存的代碼狀態(tài)重新開始執(zhí)行代碼,終止腳本執(zhí)行藤树,或從代碼中另外的位置繼續(xù)執(zhí)行腳本
1浴滴、異常的基本使用
當(dāng)異常被拋出時,其后的代碼不會繼續(xù)執(zhí)行岁钓,PHP 會嘗試查找匹配的 "catch" 代碼塊升略。
如果異常沒有被捕獲微王,而且又沒用使用 set_exception_handler() 作相應(yīng)的處理的話,那么將發(fā)生一個嚴(yán)重的錯誤(致命錯誤)品嚣,并且輸出 "Uncaught Exception" (未捕獲異常)的錯誤消息炕倘。
錯誤例子:沒有對對發(fā)出的異常進(jìn)行捕獲
<?php
function checkNum($number){
if($number>1){
throw new Exception("Value must be 1 or below"); //發(fā)出異常警告
}
return true;
}
checkNum(2); //調(diào)用函數(shù)
?>
要避免上面例子出現(xiàn)的錯誤,我們需要創(chuàng)建適當(dāng)?shù)拇a來處理異常翰撑。正確的處理程序應(yīng)當(dāng)包括:
- Try - 使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi)罩旋。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行眶诈。但是如果異常被觸發(fā)涨醋,會拋出一個異常。
- Throw - 這里規(guī)定如何觸發(fā)異常逝撬。每一個 "throw" 必須對應(yīng)至少一個 "catch"
- Catch - "catch" 代碼塊會捕獲異常浴骂,并創(chuàng)建一個包含異常信息的對象
<?php
function checkNum($number) { //創(chuàng)建可拋出一個異常的函數(shù)
if($number>1) {
throw new Exception("Value must be 1 or below"); //拋出異常
}
return true;
}
try {
checkNum(2);//在 "try" 代碼塊中觸發(fā)異常
echo 'If you see this, the number is 1 or below'; //意思是:如果看見這句話,表示輸入的數(shù)字 <= 1宪潮;
}
//捕獲異常
catch(Exception $e) { //"catch" 代碼塊接收到該異常溯警,并創(chuàng)建一個包含異常信息的對象 ($e)。
echo 'Message: ' .$e->getMessage(); //通過從這個 exception 對象調(diào)用 $e->getMessage()狡相,輸出來自該異常的錯誤消息
}
?>
//打犹萸帷:Message: Value must be 1 or below
注釋:必須遵循 每個throw 必須對應(yīng)一個 catch 的原則 !>∽亍喳挑!
但是為了防止有錯誤信息遺漏,可以設(shè)置一個頂層的異常處理器來處理漏掉的錯誤萄金。
2蟀悦、如果有多個異常
<?php
class customException extends Exception{ // 通過Extension 創(chuàng)建一個其拓展類 customException
public function errorMessage(){ //errorMessage 定義返回異常信息的函數(shù)
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example.com"; //定義Email地址
try {
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new customException($email); //如果Email地址不合法媚朦,則發(fā)出此錯誤信息
}
if(strpos($email, "example") !== FALSE){ //查詢Email地址中有沒有 example 字樣
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e) { //捕捉異常
echo $e->errorMessage();
}
catch(Exception $e) { //如果上面沒有捕捉到 customException 異常氧敢,在這里進(jìn)行處理
echo $e->getMessage();
}
?>
3、重新拋出對用戶友好的異常消息
<?php
class customException extends Exception { // 通過Extension 創(chuàng)建一個其拓展類 customException
public function errorMessage() {
$errorMsg = $this->getMessage().' is not a valid E-Mail address.'; //異常消息:E-Mail 地址無效
return $errorMsg;
}
}
$email = "someone@example.com";
//"try" 代碼塊包含另一個 "try" 代碼塊询张,這樣就可以再次拋出異常孙乖。
try {
try {
if(strpos($email, "example") !== FALSE) { //查詢Email地址中有沒有 example 字樣
throw new Exception($email);
}
}
// "catch" 捕獲到該異常,并重新拋出 "customException"份氧。
catch(Exception $e) {
throw new customException($email);
}
}
//捕獲到 "customException"唯袄,并顯示一條錯誤消息。
catch (customException $e) {
echo $e->errorMessage();
}
?>
異常的規(guī)則:
- 需要進(jìn)行異常處理的代碼應(yīng)該放入 try 代碼塊內(nèi)蜗帜,以便捕獲潛在的異常恋拷。
- 每個 try 或 throw 代碼塊必須至少擁有一個對應(yīng)的 catch 代碼塊。
- 使用多個 catch 代碼塊可以捕獲不同種類的異常厅缺。
- 可以在 try 代碼塊內(nèi)的 catch 代碼塊中再次拋出(re-thrown)異常蔬顾。
簡而言之:如果拋出了異常宴偿,就必須捕獲它。