1. 程式人生 > 實用技巧 >PHP基礎05---檔案處理

PHP基礎05---檔案處理

目錄

錯誤級別

詳見這裡

錯誤處理

​ 指的是系統(或使用者)在對某些程式碼進行執行的時候,發現有錯誤,就會通過錯誤處理的形式告知程式設計師

一、錯誤分類

  • 語法錯誤:不符合php語法規範,無法編譯更無法執行。(parse error
  • 執行錯誤:程式碼執行過程中會出現一些條件不滿足導致的錯誤(runtime error
  • 邏輯錯誤:雖然能執行,但得不到想要的結果

二、錯誤代號

​ 錯誤代號在php中都被定義成了系統常量(可直接使用

  1. 系統錯誤:

    1. E_PARSE:編譯錯誤,程式碼不會執行。
    2. E_ERROR:fatal error,致命錯誤,程式碼無法執行
    3. E_WARNING:warning,警告錯誤,不會影響程式碼執行,但是可能得到意想不到的結果
    4. E_NOTICE:notice,通知錯誤,不會影響程式碼執行
  2. 使用者錯誤:E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE.

    使用者在使用自定義錯誤觸發的時候,會使用到的錯誤代號(系統不會用到

  3. 其他:E_ALL,代表著所有的錯誤(通常在錯誤控制的時候比較多),建議在開發過程中(開發環境)使用

​ 所有以E開頭的錯誤常量(代號)其實都是由一個位元組儲存,然後每一種錯誤佔據一個對應的位,如果想進行一些錯誤的控制,可以使用位運算操作。

//排除通知級別:
	notice: E_ALL & ~E_NOTICE
//只要警告和通知:
	E_WARNING |E_NOTICE

三、錯誤觸發

​ 程式執行時觸發:系統自動根據錯誤發生後,對比對應的錯誤資訊,輸出給使用者:主要針對程式碼的語法錯誤和執行時的錯誤

​ 人為錯誤:如果某些邏輯可能會出錯,從而使用對應的判斷程式碼來觸發相應的錯誤提示

<?php
    header('Content-type:text/html;charset=utf-8');
    $a = 100;
	echo $a;
	$b = 0;
	if($b == 0){
        //人為觸發錯誤
        trigger_error('除數不能為0!'); //預設notice,會繼續執行。
        
        //通過第二個引數嚴格控制
        trigger_error('除數不能為0!',E_USER_ERROR); //預設error,程式碼下面不會繼續執行。
    }
	echo 'yyds';

錯誤顯示設定

​ 哪些錯誤該顯示,以及如何顯示

兩種方式就來設定當前指令碼的錯誤處理

  • 1.php的配置檔案:全域性配置:php.ini檔案

    display_errors:是否顯示錯誤

    error_reporting:顯示什麼級別的錯誤

  • 2.可以在執行的php指令碼中設定(指令碼中定義的配置級別比配置檔案高。)(通常在開發當中都會在指令碼中設定。

    error_reporting():

    ini_set('error_reporting',E_ALL);

    ini_set('display_errors',1);

error_reporting(-1)顯示所有錯誤,error_reporting(0)遮蔽所有錯誤。ini_set('error_reporting',0)也是遮蔽所有錯誤。可以在php.ini檔案中設定error_reporting來使指令碼顯示或不顯示某些錯誤。ini_set('display_errors','On')顯示錯誤。

  注意:error_reporting()設定報告何種錯誤,而ini_set('display_errors','On')設定是否在輸出錯誤。因而error_reporting(-1)和ini_set('display_errors',0)可用作設定日誌:報告錯誤並且不輸出。

​ ----出處

錯誤日誌設定

​ 在實際生產環境中,不會直接讓錯誤直接顯示給使用者。

為啥?

  1. 對使用者不友好
  2. 不安全:會暴露路徑和檔名等資訊。

​ 這時候,暴露出來的錯誤需要儲存到日誌檔案中,需要在php配置檔案中或者程式碼中(ini_set)設定對應的error_log配置項

設定error_log配置項

  1. 開啟日誌功能:在php.ini中找到log_errors ,確保其 = On

  2. 在php.ini中找到error_log=syslog,在它下面加入路徑。比如:error_log = 'E:/server/php8/errorlog/php_errors.log'

自定義錯誤處理

​ 最簡單的錯誤處理:trigger_errors()函式,但是不會組織系統報錯。

​ php系統提供了一種使用者處理錯的的機制,使用者自定義錯誤處理函式,然後將該函式增加作業系統處理的控制代碼中,然後系統會在碰到系統後使用使用者定義的錯誤函式

  1. 如何將使用者自定義的函式放到系統中?set_error_handler();

  2. 自定義錯誤處理函式,系統有要求(詳見上面的連結

    系統後期呼叫該自定義函式的時候,會給第一個和第二個傳遞對應的引數。(第一個第二個引數必須存在。

<?php
    
    /*@param1 $errno ,是系統提供的錯誤程式碼:E_ALL、E_NOTICE..*/
    
    function mye($errno,$errstr,$errfile,$errline){
    	//判斷當前會碰到的錯誤有哪些
    	//這一步是排除當前本身系統就要排除的錯誤
    	if(error_reporting() & $errno)//error_reporting沒有引數時,代表獲取當前系統錯誤處理對應的級別,對應errornumber
            return false;
    	//判斷錯誤型別。
    	switch($errno){
            case E_ERROR:
            case E_USER_ERROR:
                echo 'fatal error in file'.$errfile . ' on line '.errline . '<br/>';
                echo'error info:' . $errstr;
                break;
            case E_WARNING;
            case E_USER_WARNING:
                echo 'Warning in file '. $errfile.' on line '. $errline . '<br/>';
                echo 'error info:' . $errstr;
                break;
            case E_NOTICE;
            case E_USER_NOTICE:
                echo 'Notice in file '. $errfile.' on line '. $errline . '<br/>';
                echo 'error info:' . $errstr;
                break;
        }
    return true;
    
	}
	//未定義$a,用來報錯
	echo $a;

	//修改錯誤機制
	set_error_handler('檔名');

	echo $a;

當前屬於簡單自定義模式,如果要複雜,可以在某些影響程式碼功能的錯誤發生後,讓使用者跳轉到某個指定介面。