1. 程式人生 > >php-自定義錯誤類

php-自定義錯誤類

     今天在例行寫php程式碼的時候,papapa 敲完,自我感覺良好,一執行,直接報錯 。 what a fuck !  不可能! 肯定是我執行的姿勢不對,對於用習慣了laravel框架的我,內心直接吶喊三連。 仔細看程式碼,確實有try, catch 捕獲異常。 不信這個邪,搞點牛逼的程式碼再試試:

try {
    echo 1/0;
} catch (Exception $e) {
    echo $e->getMessage();
}

      一試,果然還是報錯啊,內心5s內久久不能冷靜下來,感覺自己一直以來學的是假的php.   一直以來對異常處理挺模糊的,而今天又是個陽光明媚櫻花盛開適合學習的日子(廣告一波:我武大櫻花挺美的),立下了flag,學習之!

      說幹就幹,百度,這裡就不得不說一篇文章,寫的太特麼好了,感謝作者,連結地址再談PHP錯誤與異常處理,只是在人群中多看了一眼,就被吸引住了。綜合的查了下 php錯誤有以下幾種:

      E_ERROR:通常會顯示出來,也會中斷程式執行。
      E_WARNING:通常都會顯示出來,但不會中斷程式的執行。
      E_NOTICE:在指令碼正常執行下發生的程式碼錯誤。
      E_PARSE:語法解析錯誤。

      E_CORE_ERROR:在PHP啟動時發生的致命錯誤。
      E_CORE_WARNING:報告在PHP啟動時發生的非致命性錯誤。
      E_COMPILE_ERROR:編譯時發生的致命錯誤,指出指令碼的錯誤。



      E_USER_ERROR:使用者產生的錯誤資訊。
      E_USER_WARNING:使用者產生的警告資訊。
      E_USER_NOTICE:使用者引發的注意訊息。

     E_STRICT:編碼標準化警告,執行時發生的錯誤。
     E_RECOVERABLE_ERROR:接近致命的執行時錯誤,若未被捕獲則視同E_ERROR。

     E_ALL:捕獲所有的錯誤和警告。

     而try{} catch(){} 模組只能捕獲有限的錯誤,一般情況下需要程式碼程式碼段丟擲異常才能被捕獲到,比如:

try {
    throw new Exception('同志,醒醒,報錯了');
} catch (Exception $e) {
    echo $e->getMessage();
}

      一看到這,我內心5T的草你馬飛過,我他麼都知道有錯誤了還不直接改嗎?還要丟擲幹嘛。 上面說到的那篇文章再談PHP錯誤與異常處理 又解惑了,原來php內建了  set_error_handler(),register_shutdown_function(),set_exception_handler()三個能夠捕獲異常的神器,三個函式怎麼實現的以後再探討,反正很牛逼。簡單介紹下三個函式:

     set_error_handler()  能處理E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,E_STRICT,該函式只能捕獲系統產生的一些Warning、Notice級別的錯誤

     register_shutdown_function() :  捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP指令碼執行結束前最後一個呼叫的函式,比如指令碼錯誤、die()、exit、異常、正常結束都會呼叫

     set_exception_handler() :       設定預設的異常處理程式,用在沒有用try/catch塊來捕獲的異常

    再次感謝再談PHP錯誤與異常處理 的作者! 好了,接下來就利用 這set_error_handler函式分別實現一個自定義異常類:MyErrorException,廢話少說,直接上可執行的程式碼:

MyErrorException:

final class MyErrorException extends Exception {
    protected static $instance;
    protected $message;
    protected $file;
    protected $line;
    protected $type;
    
    public function __construct($message , $file , $line , $type ) {
        $this->message = $message;
        $this->file    = $file;
        $this->line    = $line;
        $this->type    = $type;
    }
    public function message() {
        return $this->message; 
    }
    public function file() {
        return $this->file; 
    }
    public function line() {
        return $this->line; 
    }
    public function type() {
        return $this->type; 
    }
    public static function setException($type , $message , $file ,$line) {
        if(empty(self::$instance))
        {
            self::$instance = new  self($message , $file , $line , $type);
            throw  self::$instance;
        } else {
            $instance          = self::$instance;
            $instance->message = $message;
            $instance->type    = $type;
            $instance->line    = $line;
            $instance->file    = $file;
            throw  $instance;
        }

    }
}
set_error_handler(array('MyErrorException','setException'));
try {
    echo 1/0; 
} catch (MyErrorException $e) {
    echo  $e->message() .  $e->line()  . $e->file() . $e->type();
}



相關推薦

php-定義錯誤

     今天在例行寫php程式碼的時候,papapa 敲完,自我感覺良好,一執行,直接報錯 。 what a fuck !  不可能! 肯定是我執行的姿勢不對,對於用習慣了laravel框架的我,內心直接吶喊三連。 仔細看程式碼,確實有try, catch 捕獲異常。 不信

php 定義錯誤觸發資訊

ini_set("display_errors",0); // 使用者定義的錯誤處理函式 function my_error_handler($errno, $errstr, $errfile, $er

4、php錯誤異常處理(定義異常

一、php自帶的異常處理類: <?php class Exception { protected $message; // 異常資訊 protected $code; //

php 定義 autoload.php 自動載入

* 目錄結構 * autoload.php <?php // autoload ./et/lib spl_autoload_register(function($class) { $prefix = 'et\\lib'; $base_dir =

php帶壓縮壓縮文件夾

tac true pre 失敗 osi alert 關閉 自動 對象傳遞 // 壓縮文件夾 function addFileToZip($path,$zip){ $handler=opendir($path); //打開當前文件夾由$path指定。 whi

Java用定義型作為HashMap的key

str boolean 順序 string 函數 出現 print 重新 對象 ??需要重寫hashCode()和equals()方法才可以實現自定義鍵在HashMap中的查找。 public class PhoneNumber { private int pre

Laravel之加密解密/日誌/異常處理及定義錯誤

文件中 例如 tom 處理器 crypt return cat 情況 而不是 一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try {   $decrypted = Crypt::decrypt($encryptedV

學習筆記19_定義錯誤

默認 errors acc .html 調試 error redirect nbsp edi 在WebConfig中,可以配置當服務器發生哪些錯誤時,能跳轉到那個頁面: <customErrors mode ="On" defaultRedirect = " defa

轉:C#制作ORM映射學習筆記一 定義Attribute

技術 sage 其中 username pac ont 學習 collect reat 之前在做unity項目時發現只能用odbc連接數據庫,感覺非常的麻煩,因為之前做web開發的時候用慣了ORM映射,所以我想在unity中也用一下ORM(雖然我知道出於性能的考慮這樣做事不

c#(winform)中定義ListItem方便ComboBox添加Item項

urn left over string his 定義 return box item 1.定義ListItem類 public class ListItem { private string _key = string.Empty;

wordpress定義文章型描述信息description的使用

方法 類型 fun 應該 global scrip key var_dump script 上節教程中我們添加了一個自定義文章類型,配置使用了lablse參數,這裏繼續講解使用其它的參數。 先看description,這個參數是對新創建的文章類型的一個簡短描述,添加之後後臺

lumen 定義錯誤日誌文件

參數 glib ace 寫入文件 handle cnblogs 可用 perm ror 自定義錯誤日誌文件,改造新的方法 <?php namespace App; use Monolog\Logger; use Monolog\Handler\StreamHandl

MVC定義錯誤頁面

scu ebp name lte timeout sts form -m 技術   MVC異常處理主要有三種方案:1.基於HandleErrorAttribute重寫OnException方法;2.基於Global.apsx添加Application_Error方法;3.直

定義錯誤處理

處理 all 信息 誤報 綁定 ont error () err 自己定義錯誤報告的處理方式。這裏主要是要介紹一個函數set_error_handler ()函數,裏面接受兩個參數(第一個參數是一個回調函數,第二個參數規定哪一個錯報報告級別顯示用戶定義的錯誤,默認值為E_

Tomcat下使用定義錯誤頁面

tomcat html 最近在整理部分服務器的時候發現有一臺業務量並不是很大的Windows服務器可以下架了,但是目前在服務器上還有一個使用IIS的站點,知道這個站點在平時的訪問量不大,就打算做遷移,打開IIS看了下這個站點上都是html純靜態頁面,連數據庫連接的交互都沒有。好吧,這樣就簡單了,

MVC4 定義錯誤頁面(三)

gif static quest glob logger tool iis def .cn 一、概述 MVC4框架自帶了定義錯誤頁,該頁面位於Shared/Error,該頁面能夠顯示系統未能捕獲的異常,如何才能使用該頁面; 二、使用步驟: 1、配置WebConfig文件,在

php定義函數: amr轉mp3格式

com pre php mp3 ams highlight cti ror cal <?php function amr2mp3($file){ if (file_exists($file . ‘.mp3‘) == true) { retur

ASP.NET MVC下定義錯誤頁和展示錯誤頁的幾種方式

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

4. 創建定義錯誤處理器

定義 .com body 創建 inf class post png log 4. 創建自定義錯誤處理器

php定義函數: 時間轉換成智能形式

urn 自定義 分鐘 turn 智能 小時 highlight 時間 () function time_trans($paratime,$suffix=false){ $now_time = time(); $dur = $now_time - $para