php錯誤處理和php異常處理機制

來源:互聯網
上載者:User

php錯誤處理

當我們開發程式時,有時候程式出現了問題,我們就可以用以下幾種辦法找出錯誤。

開發階段:開發時輸出所有的錯誤報表,有利於我們進行程式調試
運行階段:我們不要讓程式輸出任何一種錯誤報表(不能讓使用者看到(包括懂技術, 不懂技術的人))

將錯誤報表寫入日誌中
一、指定錯誤報表 error_reporting = E_LL
二、關閉錯誤輸出 display_errors = Off
三、開啟錯誤記錄檔功能 log_errors = On

1. 預設如果不指定錯誤記錄檔位置,則預設寫WEB伺服器的日誌中
2. 為error_log選項指定 一個檔案名稱(可寫)
3. 寫入到作業系統日誌中error_log=syslog

以下程式碼範例

"; ?>

當然php還提供了函數error_get_last()來獲得錯誤資訊

函數定義和用法

error_get_last()函數擷取最後發生的錯誤。該函數以數組的形式返回最後發生的錯誤。返回的數組包含 4 個鍵和值:[type] - 錯誤類型 [message] - 錯誤訊息[file] - 發生錯誤所在的檔案[line] - 發生錯誤所在的

小例子:

輸出:Array ( [type] => 8 [message] => Undefined variable: test [file] => D:\www\test.php [line] => 2 )
所以這樣我們也很方便了。。。這樣是不是對偵錯工具和排查錯誤的時候很有協助呢?

這些錯誤報表層級是錯誤處理程式旨在處理的錯誤的不同的類型:

常量 描述
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 的一部分)

php異常處理機制

定義:

異常處理: 意外,是在程式運行過程中發生的意料這外的事,使用異常改變指令碼正常流程

文法格式:
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
";



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.