PHP中的錯誤和異常處理

2022-08-28 19:12:07 字數 3729 閱讀 9350

在編寫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();函式

這些錯誤報告級別是錯誤處理程式旨在處理的錯誤的不同的型別:值常量

描述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');

3 function myerror($error_level,$error_message)

11 if(is_writeable($filename)) else

17 fclose($fp);

18 } else

21 exit();

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、處理處理程式應當包括:

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

catch - "catch" **塊會捕獲異常,並建立乙個包含異常資訊的物件 

讓我們觸發乙個異常:

1 <?php 

2 //建立可丟擲乙個異常的函式

3 function checknum($number)

7 return true;

8 }9 10 //在 "try" **塊中觸發異常

11 trycatch(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");

trycatch(exception $e)catch(customexception $e) if($i

echo $e1->getmessage();

php錯誤和異常處理

php為異常處理提供了內建類 exception。其建構函式需要兩個引數 除了建構函式外,改類還提供了如下所示的內建方法 getcode 返回傳遞給建構函式的 getmessage 返回傳遞給建構函式的訊息 getfile 返回產生異常的 檔案的完整路徑 getline 返回 檔案中產生異常的 行號...

php 錯誤和異常處理

一 錯誤和異常處理 1.1錯誤型別和基本的除錯方法 php程式的錯誤發生一般歸屬於下列三個領域 語法錯誤 語法錯誤最常見,並且也容易修復。如 中遺漏乙個分號。這類錯誤會阻止指令碼的執行。執行時錯誤 這種錯誤一般不會阻止php指令碼的執行,但會阻止當前要做的事情。輸出一條錯誤,但php指令碼繼續執行 ...

PHP 錯誤,異常處理

ini set display errors false 影響的是否在php頁輸出錯誤資訊,但不影響在錯誤日誌檔案輸出 error reporting 0 錯誤級別,影響在php頁輸出及日誌檔案輸出 error log aaa 函式向錯誤日誌寫一條資訊,但是不受set error handler s...