PHP異常、錯誤處理機制筆記

weixin_34402408發表於2016-01-17

本文介紹PHP的異常,錯誤以及如何遮蔽錯誤。
參考:
php異常、錯誤處理機制PHP錯誤提示的關閉方法詳解


首先要明白異常跟錯誤是不一樣的,異常是出現正常邏輯之外的情況,而錯誤是指執行時出錯了,比如,使用了一個未定義的變數等,異常需要丟擲(throw)才能被捕捉到,而錯誤會導致程式執行終止

異常

使用try{}catch{}捕獲異常

<?php
try {
    throw new Exception("A terrible",13);
}
catch(Exception $e){
    echo $e->getCode()."<br>";
    echo $e->getMessage()."<br>";
    echo '錯誤在'.$e->getFile().'行'.$e->getLine()."列<br>";

    var_dump( $e->getTrace() );
    echo "<br>".$e->getTraceAsString();
    echo "<br>".$e->__toString()."<br>";//echo "<br>".$e;
}
?>

可以直接使用set_exception_handler函式捕獲throw丟擲的異常

<?php
//設定一個使用者的函式(error)來處理指令碼中出現的錯誤。
//set_exception_handler()會自動捕捉錯誤
set_exception_handler('exception1');
throw new Exception("kkkkkkkkkkkkkkkk");
function exception1(Exception $exception){
    echo $exception->getMessage();
}
?>

錯誤

使用者自定義的錯誤處理

<?php
set_error_handler('errorHandler');  
trigger_error("這裡描述錯誤",E_USER_ERROR);
//E_USER_ERROR:該error 所特定的錯誤型別,預設是E_USER_NOTICE
function errorHandler($errno,$errstr){
//使用者的函式需要接受兩個引數:錯誤碼和描述錯誤的 string
    if($errno==E_USER_ERROR){  
        echo "錯誤為:",$errstr.'<br>';  
    } 
}
?>

使用函式捕獲系統不提示的錯誤
前幾個都不知如何使用,如果使用這個可以在變數未定義就呼叫時提示錯誤

<?php
set_error_handler('errorHandler2');  
echo $ccc;
function errorHandler2($errno,$errstr){
//使用者的函式需要接受兩個引數:錯誤碼和描述錯誤的 string
    if($errno==E_NOTICE){//這裡應該是如果出現(預設)非使用者錯誤
        echo "錯誤為:",$errstr;  
    } 
}
echo "<br>這裡正常執行";
?>

遮蔽php錯誤

錯誤的種類

  • 注意(Notices)這些都是比較小而且不嚴重的錯誤,比如去訪問一個未被定義的變數。通常,這類的錯誤是不提示給使用者的,但有時這些錯誤會影響到執行的結果。
  • ** 警告(Warnings)**這就是稍微嚴重一些的錯誤了,比如想要包含include()一個本身不存在的檔案。這樣的錯誤資訊會提示給使用者,但不會導致程式終止執行。
  • 致命錯誤(Fatal errors)這些就是嚴重的錯誤,比如你想要初始化一個根本不存在的類的物件,或呼叫一個不存在的函式,這些錯誤會導致程式停止執行,PHP也會把這些錯誤展現給使用者。

遮蔽錯誤的方法

方法一:在有可能出錯的函式前加@,然後or die("")
如: @mysql_connect(...) or die("Database Connect Error")
再例如:

<?php
    $file=fopen("filename.php", 'r');
    //返回Warning: fopen(filename.php): failed to open stream: No such file or directory in E:\xampp\htdocs\php\error-1.php on line 7
    @$file=fopen("filename.php", 'r') or die('沒有找到該檔案');
    //返回"沒有找到該檔案"
?>

方法二:編輯php.ini ,查詢"display_errors =" ,將“=”後面的值改為"off。
可以百度有詳解,在測試過程中最好不要修改
方法三:在php指令碼前加error_reporting(0),遮蔽所有錯誤提示。其中,error_reporting 配置錯誤資訊回報的等級。


總結,異常和錯誤處理現在還不會應用。
遮蔽錯誤十分有用且第一種方法最常用。
持續學習中,不定期更新

相關文章