PHP中的錯誤處理 異常處理機制

2021-06-29 01:35:14 字數 4248 閱讀 7471

我們涉及到幾個函式:

set_error_handler()

set_exception_handler()

也可以參考: 

在編寫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就可以使用自定義的錯誤處理函式了

練習題:

1

<?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 ?>

c、錯誤日誌 

預設的根據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中的錯誤處理 異常處理機制

在編寫php程式時,錯誤處理是乙個重要的部分。如果程式中缺少錯誤檢測 那麼看上去很不專業,也為安全風險敞開了大門 例 a fopen test.txt r 這裡並沒有對檔案進行判斷就開啟了,如果檔案不存在就會報錯 那麼正確的寫法應該如下 if file exists test.txt 一 php錯誤...

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

php錯誤處理 當我們開發程式時,有時候程式出現了問題,我們就可以用以下幾種辦法找出錯誤。開發階段 開發時輸出所有的錯誤報告,有利於我們進行程式除錯 執行階段 我們不要讓程式輸出任何一種錯誤報告 不能讓使用者看到 包括懂技術,不懂技術的人 將錯誤報告寫入日誌中 一 指定錯誤報告 error repo...

php中錯誤處理機制

php中,異常處理機制是有限的,無法自動丟擲異常,必須手動進行,並且內建異常有限。php把許多異常看作錯誤,這樣就可以把這些異常想錯誤一樣用set error handler接管,進而主動丟擲異常。比如以下warning型別的錯誤是捕獲不到的 warning division by zero in ...