在編寫php程式時,錯誤處理是乙個重要的部分。如果程式中缺少錯誤檢測**,那麼看上去很不專業,也為安全風險敞開了大門 例:
<?php
$a = fopen('test.txt','r');
//這裡並沒有對檔案進行判斷就開啟了,如果檔案不存在就會報錯
?>
那麼正確的寫法應該如下:
<?php
if(file_exists('test.txt'))
?>
一、php錯誤處理的三種方式
a、簡單的die()語句;
等價於exit();
例:if(!file_exists('aa.txt')) else
//如果上面die()被觸發,那麼這裡echo接不被執行
echo 'ok';
簡潔寫法:
file_exits('aaa.txt') or die('檔案不存在');
echo 'ok';
b、自定義錯誤和錯誤觸發器
1、錯誤處理器(自定義錯誤,一般用於語法錯誤處理)
建立自定義錯誤函式(處理器),該函式必須有能力處理至少兩個引數(error_level和errormessage),但是可以接受最多五個引數(error_file、error_line、error_context)
語法:function error_function($error_level,$error_message,$error_file,$error_line,$error_context)
//建立好後還需要改寫set_error_handler();函式
set_error_handler('error_function',e_warning);//這裡error_function對應上面建立的自定義處理器名,第二個引數為使用自定義錯誤處理器的錯誤級別;
這些錯誤報告級別是錯誤處理程式旨在處理的錯誤的不同的型別:值常量
描述2e_warning
非致命的 run-time 錯誤。不暫停指令碼執行。
8e_notice
run-time 通知。
指令碼發現可能有錯誤發生,但也可能在指令碼正常執行時發生。
256e_user_error
致命的使用者生成的錯誤。這類似於程式設計師使用 php 函式 trigger_error() 設定的 e_error。
512e_user_warning
非致命的使用者生成的警告。這類似於程式設計師使用 php 函式 trigger_error() 設定的 e_warning。
1024
e_user_notice
使用者生成的通知。這類似於程式設計師使用 php 函式 trigger_error() 設定的 e_notice。
4096
e_recoverable_error
可捕獲的致命錯誤。類似 e_error,但可被使用者定義的處理程式捕獲。(參見 set_error_handler())
8191
e_all
所有錯誤和警告,除級別 e_strict 以外。
(在 php 6.0,e_strict 是 e_all 的一部分)
2、錯誤觸發器(一般用於處理邏輯上的錯誤)
需求:比如要接收乙個年齡,如果數字大於120,就認為是乙個錯誤傳統方法:
if($age>120)使用觸發器:
if($age>120)
//自定義處理器,與上面相同
function myerror($error_level,$error_message)
//同時需要改變系統預設的處理函式
set_error_handler('myerror',
e_user_warning);//同上面,第乙個引數為自定義函式的名稱,第二個為錯誤級別【這裡的錯誤級別通常為以下三種:
e_user_warning 、
e_user_error 、
e_user_notice】
//現在再使用trigger_error就可以使用自定義的錯誤處理函式了
練習題:
1c、錯誤日誌<?php
2 date_default_timezone_set('prc');
3function myerror($error_level,$error_message)11
if(is_writeable($filename
)) else
17fclose($fp
);18 } else
21exit
();22}23
set_error_handler('myerror',e_warning
);24
$fp=fopen('aaa.txt','r');
25 ?>
預設的根據php.ini中error_log配置,php向伺服器的錯誤記錄系統或檔案傳送錯誤記錄。通過使用
error_log()函式可以向檔案或遠端目的地傳送錯誤記錄;
語法:error_log(error[,type,destination,headers])
type部分一般用3,表示在檔案後面追加錯誤資訊,而不會覆蓋原內容
destination表示目的地,即存放的檔案或遠端目的地
如:error_log("$error_info",3,"errors.txt");
二、php異常處理【重點】
1、基本語法
try catch(exception $e)
2、處理處理程式應當包括:
try - 使用異常的函式應該位於 "try" **塊內。如果沒有觸發異常,則**將照常繼續執行。但是如果異常被觸發,會丟擲乙個異常。
throw - 這裡規定如何觸發異常。每乙個 "throw" 必須對應至少乙個 "catch"
catch - "catch" **塊會捕獲異常,並建立乙個包含異常資訊的物件
讓我們觸發乙個異常:
1上面**將獲得類似這樣乙個錯誤:<?php2 //
建立可丟擲乙個異常的函式
3function checknum($number)7
return
true;8
}910//
在 "try" **塊中觸發異常
11try
catch(exception$e)
19 ?>
message: value must be 1 or below上面的**丟擲了乙個異常,並捕獲了它:
建立 checknum() 函式。它檢測數字是否大於 1。如果是,則丟擲乙個異常。
在 "try" **塊中呼叫 checknum() 函式。
checknum() 函式中的異常被丟擲
"catch" **塊接收到該異常,並建立乙個包含異常資訊的物件 ($e)。
通過從這個 exception 物件呼叫 $e->getmessage(),輸出來自該異常的錯誤訊息
不過,為了遵循「每個 throw 必須對應乙個 catch」的原則,可以設定乙個頂層的異常處理器來處理漏掉的錯誤。
set_exception_handler()
函式可設定處理所有未捕獲異常的使用者定義函式
//設定乙個頂級異常處理器
function myexception($e) //修改預設的異常處理器
set_exception_handler("myexception");
try
}catch(exception $e)
建立乙個自定義的異常類
class customexception extends exception
} //使用
trycatch(customexception $e)
可以使用多個catch來返回不同情況下的錯誤資訊
try if($i
}catch(customexception $e)catch(exception $e1)
簡而言之:如果丟擲了異常,就必須捕獲它。
PHP中的錯誤處理 異常處理機制
我們涉及到幾個函式 set error handler set exception handler 也可以參考 在編寫php程式時,錯誤處理是乙個重要的部分。如果程式中缺少錯誤檢測 那麼看上去很不專業,也為安全風險敞開了大門 例 a fopen test.txt r 這裡並沒有對檔案進行判斷就開啟了...
php錯誤處理和php異常處理機制
php錯誤處理 當我們開發程式時,有時候程式出現了問題,我們就可以用以下幾種辦法找出錯誤。開發階段 開發時輸出所有的錯誤報告,有利於我們進行程式除錯 執行階段 我們不要讓程式輸出任何一種錯誤報告 不能讓使用者看到 包括懂技術,不懂技術的人 將錯誤報告寫入日誌中 一 指定錯誤報告 error repo...
php中錯誤處理機制
php中,異常處理機制是有限的,無法自動丟擲異常,必須手動進行,並且內建異常有限。php把許多異常看作錯誤,這樣就可以把這些異常想錯誤一樣用set error handler接管,進而主動丟擲異常。比如以下warning型別的錯誤是捕獲不到的 warning division by zero in ...