錯誤和異常 (一):錯誤基礎知識

maole發表於2019-03-19

思維導圖:

file

1 什麼叫錯誤

書面一點的解釋:php指令碼自身原因,大部分是由於錯誤的語法,或者伺服器環境造成的php指令碼無法通過編譯,或者無法正常執行的情況。

注意:

1 並不是所有的錯誤都會造成指令碼無法執行,部分錯誤發生後指令碼繼續執行

2 正常情況下,錯誤並不能被try catch捕捉

2 錯誤的級別

1 Parse error 解析錯誤 (指令碼不能繼續執行)

解析錯誤舉例:

程式碼未以分號結尾
$num = 0 //執行結果:Parse error: syntax error, unexpected 'echo' (T_ECHO) 

2 Fatal error 致命錯誤 (指令碼不能繼續執行)

致命錯誤舉例:

呼叫未定義的函式
test();  //執行結果:Fatal error: Uncaught Error: Call to undefined function test()

3 Warning 警告(給出錯誤資訊,指令碼繼續執行)

警告舉例:

除以0

1000 /0; 執行結果:Warning: Division by zero

4 Notice 注意 (給出錯誤資訊,指令碼繼續執行)

注意錯誤舉例:

輸出未定義的變數

echo $a; //執行結果:Notice: Undefined variable: a

5 deprecated:最低階別的錯誤 (指令碼繼續執行)

在php7以下版本會出現

3 必知必會函式

1 error_report 設定錯誤的報告級別

在工作中我們經常會用到這個函式來設定php的錯誤報錯,比如忽略notice報告:error_reporting(E_ALL ^ E_NOTICE);

可用版本:(PHP 4, PHP 5, PHP 7)

用法:error_reporting ([ int $level ] ) : int

level引數是錯誤的預定義常量

例項:

<?php

// 關閉所有PHP錯誤報告
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 報告 E_NOTICE也挺好 (報告未初始化的變數
// 或者捕獲變數名的錯誤拼寫)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 除了 E_NOTICE,報告其他所有錯誤
error_reporting(E_ALL ^ E_NOTICE);

// 報告所有 PHP 錯誤 (參見 changelog)
error_reporting(E_ALL);

2 set_error_handler 設定使用者自定義的錯誤處理函式

這個函式可以按照你自己定義的方式來處理錯誤,在後面的專題還會詳細的講解,這裡先簡單講解一下

可用版本:(PHP 4 >= 4.0.1, PHP 5, PHP 7)

說明:set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

引數解釋:
$error_handler : 我們自己自定義的函式

$error_types:錯誤的預定義常量, error_types 裡指定的錯誤型別都會繞過 PHP 標準錯誤處理程式, 除非回撥函式返回了 FALSE

例項:

<?php
set_error_handler('myErrorFun'); //把php原始的錯誤處理機制,變成我們的myErrorFun函式處理
function myErrorFun($errno, $message, $file, $line)
{
    echo '錯誤碼是:'.$errno.'</br>';
    echo '錯誤的資訊是'.$message.'</br>';
    echo '錯誤的檔案是:'.$file.'</br>';
    echo '錯誤的行數是'.$line;
}

echo $a; //a是未定義的變數

//列印結果:
錯誤碼是:8
錯誤的資訊是Undefined variable: a
錯誤的檔案是:D:\project\mz_php_server\public\test.php
錯誤的行數是12

4 錯誤的相關配置

錯誤的配置也是我們需要掌握的重要內容

配置檔案:php.ini檔案

相關配置:

1 錯誤日誌是否開啟
log_errors = On (Off)

2 錯誤日誌記錄的位置
error_log = php_errors.log

3 是否開啟錯誤顯示
display_errors = Off (Off)

4 定義錯誤顯示的級別
error_reporting = E_ALL (錯誤的預定義常量)

轉載自我的部落格:毛樂的個人部落格

相關文章