天天看點

解決PHP中的出現的錯誤處理以及異常處理機制的辦法

本篇文章給大家分享的内容是解決PHP中的出現的錯誤處理以及異常處理機制的辦法,有着一定的參考價值,有需要的朋友可以參考一下

在編寫PHP程式時,錯誤處理是一個重要的部分。如果程式中缺少錯誤檢測代碼,那麼看上去很不專業,也為安全風險敞開了大門

例:

1 2 3 4

<?php

$a

=

fopen

(

'test.txt'

,

'r'

);

//這裡并沒有對檔案進行判斷就打開了,如果檔案不存在就會報錯

?>

那麼正确的寫法應該如下:

1 2 3 4 5 6 7

<?php

if

(

file_exists

(

'test.txt'

)) {

$f

=

fopen

(

'test.txt'

,

'r'

);

// 使用完後關閉

fclose(

$f

);

}

?>

一、PHP錯誤處理的三種方式

A、簡單的die()語句;

等價于exit();

例:

1 2 3 4 5 6 7

if

(!

file_exists

(

'aa.txt'

)) {

die

(

'檔案不存在'

);

}

else

{

// 執行操作

}

// 如果上面die()被觸發,那麼這裡echo接不被執行

echo

'ok'

;

簡潔寫法:

1 2

file_exits(

'aaa.txt'

)

or

die

(

'檔案不存在'

);

echo

'ok'

;

B、自定義錯誤和錯誤觸發器

1、錯誤處理器(自定義錯誤,一般用于文法錯誤處理)

建立自定義錯誤函數(處理器),該函數必須有能力處理至少兩個參數(error_level和errormessage),但是可以接受最多五個參數(error_file、error_line、error_context)

文法:

1 2 3

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對應上面建立的自定義處理器名,第二個參數為使用自定義錯誤處理器的錯誤級别;

錯誤報告級别(了解即可)

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

1 2 3 4 5 6 7 8

值        常量                                  描述

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 的一部分)

2、錯誤觸發器(一般用于處理邏輯上的錯誤)

需求:比如要接收一個年齡,如果數字大于120,就認為是一個錯誤

傳統方法:

1 2 3 4 5 6

<?php

if

(

$age

> 120) {

echo

'年齡錯誤'

;

exit

();

}

?>

使用觸發器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

<?php

if

(

$age

> 120) {

// trigger_error('錯誤資訊'[,'錯誤等級']); 這裡錯誤等級為可選項,用于定義該錯誤的級别

// 使用者定義的級别包含以下三種:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE

trigger_error(

'年齡錯誤'

);

// 這裡是調用的系統預設的錯誤處理方式,我們也可以用自定義處理器

}

function

myerror(

$error_level

,

$error_message

) {

echo

'error text'

;

}

//  同時需要改變系統預設的處理函數

set_error_handler(

'myerror'

, E_USER_WARNING);

// 同上面,第一個參數為自定義函數的名稱,第二個為錯誤級别【這裡的錯誤級别通常為以下三種:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】

// 現在再使用trigger_error就可以使用自定義的錯誤處理函數了

?>

練習題:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

<?php

date_default_timezone_set(

'PRC'

);

function

myerror(

$error_level

,

$error_message

) {

$info

=

"錯誤号:$error_level"

;

$info

.=

"錯誤資訊:$error_message"

;

$info

.=

'發生時間:'

.

date

(

'Y-m-d H:i:s'

);

$filename

=

'aa.txt'

;

if

(!

$fp

=

fopen

(

$filename

,

'a'

)) {

echo

'建立檔案'

.

$filename

.

'失敗'

;

}

if

(

is_writeable

(

$filename

)) {

if

(!fwrite(

$fp

,

$info

)) {

echo

'寫入檔案失敗'

;

}

else

{

echo

'已成功記錄錯誤資訊'

;

}

fclose(

$fp

);

}

else

{

echo

'檔案'

.

$filename

.

'不可寫'

;

}

exit

();

}

set_error_handler(

'myerror'

, E_WARNING);

$fp

=

fopen

(

'aaa.txt'

,

'r'

);

?>

C、錯誤日志

預設的根據php.ini中error_log配置,PHP向伺服器的錯誤記錄系統或檔案發送錯誤記錄。通過使用error_log()函數可以向檔案或遠端目的地發送錯誤記錄;

文法:

1

error_log

(error[, type, destination, headers])

type部分一般用3,表示在檔案後面追加錯誤資訊,而不會覆寫原内容destination表示目的地,即存放的檔案或遠端目的地

如:error_log("$error_info",3,"errors.txt");

二、PHP異常處理【重點】

1、基本文法

1 2 3 4 5 6 7 8 9 10

<?php

try

{

// 可能出現錯誤或異常的代碼

//catch 捕獲  Exception是PHP已定義好的異常類

}

catch

(Exception

$e

) {

// 對異常處理,方法:

//1、自己處理

//2、不處理,可以再次抛出 throw new Exception('xxx');

}

?>

2、處理處理程式應當包括:

try - 使用異常的函數應該位于 "try" 代碼塊内。如果沒有觸發異常,則代碼将照常繼續執行。但是如果異常被觸發,會抛出一個異常;

throw - 這裡規定如何觸發異常。每一個 "throw" 必須對應至少一個 "catch";

catch - "catch" 代碼塊會捕獲異常,并建立一個包含異常資訊的對象;

讓我們觸發一個異常:

<

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

?php

function

checkNum(

$number

) {

if

(

$number

> 1) {

throw

new

Exception(

"Value must be 1 or below"

);

}

return

true;

}

// 在 "try" 代碼塊中觸發異常

try

{

checkNum(2);

// 如果異常被抛出,那麼下面一行代碼将不會被輸出

echo

'If you see this, the number is 1 or below'

;

}

catch

(Exception

$e

) {

// 捕獲異常

echo

'Message: '

.

$e

->getMessage();

}

?>

上面代碼将獲得類似這樣一個錯誤:

Message: Value must be 1 or below

例子解釋:

上面的代碼抛出了一個異常,并捕獲了它:

建立 checkNum() 函數,它檢測數字是否大于 1,如果是,則抛出一個異常。

在 "try" 代碼塊中調用 checkNum() 函數。

checkNum() 函數中的異常被抛出。

"catch" 代碼塊接收到該異常,并建立一個包含異常資訊的對象 ($e)。

通過從這個 exception 對象調用 $e->getMessage(),輸出來自該異常的錯誤消息。

不過,為了遵循“每個 throw 必須對應一個 catch”的原則,可以設定一個頂層的異常處理器來處理漏掉的錯誤。

set_exception_handler()函數可設定處理所有未捕獲異常的使用者定義函數。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

<?php

function

myexception(

$e

) {

echo

'this is top exception'

;

}

// 修改預設的異常處理器

set_exception_handler(

"myexception"

);

try

{

$i

= 5;

if

(

$i

< 10) {

throw

new

Exception(

'$i must greater than 10'

);

}

}

catch

(Exception

$e

) {

// 處理異常

echo

$e

->getMessage() .

'<br/>'

;

// 不處理異常,繼續抛出

throw

new

Exception(

'errorinfo'

);

// 也可以用throw $e 保留原錯誤資訊;

}

?>

建立一個自定義的異常類

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<?php

class

customException

extends

Exception {

public

function

errorMessage() {

$errorMsg

=

'Error on line '

.

$this

->getLine() .

' in '

.

$this

->getFile() .

': <b>'

.

$this

->getMessage() .

'</b> is not a valid E-Mail address'

;

return

$errorMsg

;

}

}

// 使用

try

{

throw

new

customException(

'error message'

);

}

catch

(customException

$e

) {

echo

$e

->errorMessage();

}

?>

可以使用多個catch來傳回不同情況下的錯誤資訊

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<?php

try

{

$i

= 5;

if

(

$i

> 0) {

throw

new

customException(

'error message'

);

// 使用自定義異常類處理

}

if

(

$i

< -10) {

throw

new

Exception(

'error2'

);

// 使用系統預設異常處理

}

}

catch

(customException

$e

) {

echo

$e

->getMessage();

}

catch

(Exception

$e1

) {

echo

$e1

->getMessage();

}

?>

異常的規則

需要進行異常處理的代碼應該放入 try 代碼塊内,以便捕獲潛在的異常。

每個try或throw代碼塊必須至少擁有一個對應的 catch 代碼塊。

使用多個 catch 代碼塊可以捕獲不同種類的異常。

可以在try代碼内的catch 代碼塊中再次抛出(re-thrown)異常。

簡而言之:如果抛出了異常,就必須捕獲它。

以上就是解決PHP中的出現的錯誤處理以及異常處理機制的辦法的詳細内容,更多請關注php中文網其它相關文章!