基本的錯誤處理:使用 die() 函數
第一個例子展示了一個開啟文字檔的簡單指令碼:
代碼如下 |
複製代碼 |
<?php $file=fopen("welcome.txt","r"); ?> |
如果檔案不存在,您會獲得類似這樣的錯誤:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2為了避免使用者獲得類似上面的錯誤訊息,我們在訪問檔案之前檢測該檔案是否存在:
代碼如下 |
複製代碼 |
<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?> |
現在,假如檔案不存在,您會得到類似這樣的錯誤訊息:
File not found比起之前的代碼,上面的代碼更有效,這是由於它採用了一個簡單的錯誤處理機制在錯誤之後終止了指令碼。
不過,簡單地終止指令碼並不總是恰當的方式。讓我們研究一下用於處理錯誤的備選的 PHP 函數。
下面我們來看一個自定錯誤處理函數
代碼如下 |
複製代碼 |
function myErrorHandler($errno, $errstr, $errfile, $errline){ if(!(error_reporting() &$errno)){return;} switch ($errno){ case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br/>"; echo "錯誤行:$errline 在檔案:$errfile之中<br/>"; echo " PHP版本: " .PHP_VERSION ." (" .PHP_OS .")<br/>"; break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br/>"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />"; break; default: echo "Unknown error type: [$errno] $errstr<br />"; break; } return true; } function trigger_test($age){//拋出錯誤的測試函數 if($age <= 0 || $age > 999) trigger_error("年齡不合法:$age歲", E_USER_ERROR); if($age < 18) trigger_error("未成年:$age歲", E_USER_WARNING); if($age > 40 && $age < 100) trigger_error("年齡稍大:$age歲", E_USER_NOTICE); } //如果只是簡單統一地處理錯誤: $errorHandler = set_error_handler("myErrorHandler"); trigger_test(1000);//會拋出一個error級的錯誤 function myError($errno, $errstr, $errfile, $errline){ print_r(func_get_args()); //具體處理方法 } function myWarning($errno, $errstr, $errfile, $errline){ print_r(func_get_args()); //具體處理方法 }
function myNtice($errno, $errstr, $errfile, $errline){ print_r(func_get_args()); //具體處理方法 } |
//如果要分別處理不同錯誤層級:
代碼如下 |
複製代碼 |
set_error_handler('myError',E_USER_ERROR); set_exception_handler('myWarning',E_USER_WARNING); set_exception_handler('myNtice',E_USER_NOTICE);
|
trigger_error('故意拋出個錯誤,還是很嚴重的哪一種!',E_USER_ERROR);
下面還附上php一些錯誤碼詳解
參數 |
描述 |
error_level |
必需。為使用者定義的錯誤規定錯誤報表層級。必須是一個值數。 參見下面的表格:錯誤報表層級。 |
error_message |
必需。為使用者定義的錯誤規定錯誤訊息。 |
error_file |
可選。規定錯誤在其中發生的檔案名稱。 |
error_line |
可選。規定錯誤發生的行號。 |
error_context |
可選。規定一個數組,包含了當錯誤發生時在用的每個變數以及它們的值。 |
錯誤報表層級
這些錯誤報表層級是錯誤處理程式旨在處理的錯誤的不同的類型:
值 |
常量 |
描述 |
2 |
E_WARNING |
非致命的 run-time 錯誤。不暫停指令碼執行。 |
8 |
E_NOTICE |
Run-time 通知。 指令碼發現可能有錯誤發生,但也可能在指令碼正常運行時發生。 |
256 |
E_USER_ERROR |
致命的使用者產生的錯誤。這類似於程式員使用 PHP 函數 trigger_error() 設定的 E_ERROR。 |
512 |
E_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 的一部分) |