當我們開發程序時,有時候程序出現了問題,我們就可以用以下幾種辦法找出錯誤。
開發階段:開發時輸出所有的錯誤報告,有利於我們進行程序調試
運行階段:我們不要讓程序輸出任何一種錯誤報告(不能讓用戶看到(包括懂技術, 不懂技術的人))
將錯誤報告寫入日志中
一、指定錯誤報告 error_reporting = E_LL
二、關閉錯誤輸出 display_errors = Off
三、開啟錯誤日志功能 log_errors = On
1. 默認如果不指定錯誤日志位置,則默認寫WEB服務器的日志中
2. 為error_log選項指定 一個文件名(可寫)
3. 寫入到操作系統日志中error_log=syslog
"; ?>
輸出: Array ( [type] => 8 [message] => Undefined variable: test [file] => D:\www\test.php [line] => 2 )所以這樣我們也很方便了。。。這樣是不是對調試程序和排查錯誤的時候很有幫助呢?
這些錯誤報告級別是錯誤處理程序旨在處理的錯誤的不同的類型:
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 的一部分)
異常處理: 意外,是在程序運行過程中發生的意料這外的事,使用異常改變腳本正常流程
try { //...} catch(Exception $e) { //...}
PHP中try{}catch{}是異常處理.
將要執行的代碼放入TRY塊中,如果這些代碼執行過程中某一條語句發生異常,則程序直接跳轉到CATCH塊中,由$e收集錯誤信息和顯示.
PHP中try{}catch{}語句
為了進一步處理異常,我們需要使用PHP中try{}catch{}----包括Try語句和至少一個的catch語句。任何調用 可能拋出異常的方法的代碼都應該使用try語句。Catch語句用來處理可能拋出的異常。我寫一段代碼:
自己定義一個異常類
作用:就是寫一個或多個方法解決當發生這個異常時的處理方式
1. 自己定義異常類,必須是Exception(內置類)的子類, 可以查看PHP手冊裡面Exception(內置類)的使用方法
2. Exception類中的只有構造方法和toString()可以重寫, 其它都final
"; } function open(){ touch("tmp.txt"); $file=fopen("tmp.txt", "r"); return $file; } } ?>
1. 如果try中代碼沒有問題,則將try中代碼執行完後就到catch後執行
2. 如果try中代碼有異常發生,則拋出一個異常對象(使用throw),拋出給了catch中的參數, 則在try中代碼就不會再繼續執行下去 直接跳轉到catch中去執行, catch中執行完成, 再繼續向下執行
注意: 提示發生了什麼異常,這不是主要我們要做事,需要在catch中解決這個異常, 如果解決不了,則出去給用戶在下面代碼中,如果我沒有這個TMP.TXT文件的話,就會拋出異常了。
如果有異常,我們調用OPEN方法就可以解決這個異常了。
getMessage()."
"; //getMessage() 是PHP裡面內置的方法,可以直接調用 $file=$e->open(); }
下面將代碼進行整理以及多個異常處理方法:
"; } function open(){ touch("tmp.txt"); $file=fopen("tmp.txt", "r"); return $file; } } class DemoException extends Exception { function pro(){ echo "處理demo發生的異常
"; } } class TestException extends Exception { function pro(){ echo "這裡處理test發生的異常
"; } } class HelloException extends Exception { } class MyClass { function openfile(){ $file=@fopen("tmp.txt", "r"); if(!$file) throw new OpenFileException("文件打開失敗"); } function demo($num=0){ if($num==1) throw new DemoException("演示出異常"); } function test($num=0){ if($num==1) throw new TestException("測試出錯"); } function fun($num=0){ if($num==1) throw new HelloException("###########"); } } try{ echo "11111111111111
"; $my=new MyClass(); $my->openfile(); $my->demo(0); $my->test(0); $my->fun(1); echo "22222222222222222
"; }catch(OpenFileException $e){ //$e =new Exception(); echo $e->getMessage()."
"; $file=$e->open(); }catch(DemoException $e){ echo $e->getMessage()."
"; $e->pro(); }catch(TestException $e){ echo $e->getMessage()."
"; $e->pro(); }catch(Exception $e){ echo $e->getMessage()."
"; } var_dump($file); echo "444444444444444444444
";