<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                在PHP 7之前,**Exception**未實現[Throwable](https://www.php.net/manual/en/class.throwable.php)接口。 ~~~ Exception { /* 屬性 */ protected string $message ;//異常消息內容 protected int $code ;//異常代碼 protected string $file ;//拋出異常的文件名 protected int $line ;//拋出異常在該文件中的行號 /* 方法 */ public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] ) final public getMessage ( void ) : string//獲取異常消息內容 final public getPrevious ( void ) : Throwable//返回異常鏈中的前一個異常 final public getCode ( void ) : int//獲取異常代碼 final public getFile ( void ) : string// 創建異常時的程序文件名稱 final public getLine ( void ) : int//獲取創建的異常所在文件中的行號 final public getTrace ( void ) : array//獲取異常追蹤信息 final public getTraceAsString ( void ) : string// 獲取字符串類型的異常追蹤信息 public __toString ( void ) : string//將異常對象轉換為字符串 final private __clone ( void ) : void//異常克隆 } ~~~ php7+ ~~~ Exception implements Throwable{ /* 屬性 */ protected string $message ;//異常消息內容 protected int $code ;//異常代碼 protected string $file ;//拋出異常的文件名 protected int $line ;//拋出異常在該文件中的行號 /* 方法 */ public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] ) final public getMessage ( void ) : string//獲取異常消息內容 final public getPrevious ( void ) : Throwable//返回異常鏈中的前一個異常 final public getCode ( void ) : int//獲取異常代碼 final public getFile ( void ) : string// 創建異常時的程序文件名稱 final public getLine ( void ) : int//獲取創建的異常所在文件中的行號 final public getTrace ( void ) : array//獲取異常追蹤信息 final public getTraceAsString ( void ) : string// 獲取字符串類型的異常追蹤信息 public __toString ( void ) : string//將異常對象轉換為字符串 final private __clone ( void ) : void//異常克隆 } ~~~ 所以在php7+中,如果既想捕獲異常有需要捕獲錯誤$e是Error和Exception的基類Throwable ~~~ try{ ... }catch ( Throwable $e){ echo $e->getCode().'<br/>'; echo $e->getMessage().'<br/>'; echo $e->getLine().'<br/>'; echo $e->getFile().'<br/>'; } ~~~ 除了Exception之外還有Error類,[這個網站](https://3v4l.org/sDMsv)列出了各個版本的錯誤類 * * * ## 設置頂層異常處理器 (Top Level Exception Handler) >[danger]注:set\_error\_handler("myError") 、set\_exception\_handler("myException")、register\_shutdown\_function("myShutdown")不僅可以接受函數,還可以接受類的方法(公開的靜態方法及公開的非靜態方法),但需要以數組形式傳遞,數組的第一個值為“類名”,第二個值為“方法名”。 **1、error\_reporting()** error\_reporting() 函數設置當前腳本的錯誤報告級別,規定報告哪種錯誤。E\_ALL為顯示所有的錯誤和警告信息,類似的級別還有E\_ERROR—運行時致命的錯誤、E\_WARNING—運行時非致命的錯誤、E\_NOTICE-—運行時的通知。 **2、set_error_handler()** 設置自定義異常函數代替默認的異常處理程序,處理沒有被 try/catch 塊捕獲的異常。 在 `exception_handler` 調用后異常會中止 用于創建運行時期間的用戶自己的錯誤處理方法 set_error_handler指定【自定義函數】來處理系統錯誤,捕獲錯誤后把錯誤以異常的形式拋出。當程序出現錯誤的時候自動調用【此自定義函數】 **3、set\_exception\_handler()** set\_exception\_handler 指定的自定義函數來處理用戶拋出的異常,如果不是異常,就實例化ThrowableError類,將異常包裝起來并拋出。 **4、register\_shutdown\_function()** register\_shutdown\_function指定appShutdown處理超時異常。 注冊一個會在php中止時執行的函數 注冊一個`callback`,它會在腳本執行完成或者`exit()`后被調用。 set_exception_handler() 函數可設置處理所有未捕獲異常的用戶定義函數。(即沒有用 try/catch 塊來捕獲的異常或者try/catch沒有捕獲到的) ~~~ function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); //使用: throw new Exception('Uncaught Exception occurred'); ~~~ ## 設置頂層錯誤處理器set\_error\_handler 設置用戶自定義的錯誤處理函數 E\_ERROR、E\_PARSE、E\_CORE\_ERROR、E\_CORE\_WARNING、 E\_COMPILE\_ERROR、E\_COMPILE\_WARNING是不會被這個句柄處理的,也就是會用最原始的方式顯示出來。不過出現這些錯誤都是編 譯或PHP內核出錯,在通常情況下不會發生。(也就是說如果在腳本執行前發生錯誤,由于在那時自定義程序還沒有注冊,因此就不會用到這個自定義錯誤處理程序) ~~~ //自定義的錯誤處理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "錯誤編號errno: $errno<br>"; echo "錯誤信息errstr: $errstr<br>"; echo "出錯文件errfile: $errfile<br>"; echo "出錯行號errline: $errline<br><br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注冊錯誤處理方法來處理所有錯誤 echo $foo['bar']; // 由于數組未定義,會產生一個notice級別的錯誤 //人為觸發錯誤 trigger_error('人為觸發一個錯誤', E_USER_ERROR); trigger_error('人為觸發一個錯誤', E_ERROR); ~~~ 這兩個錯誤都會被自定義的函數捕獲 ~~~ 錯誤編號errno: 8 錯誤信息errstr: Undefined variable: foo 出錯文件errfile: D:\\phpstudy\_pro\\WWW\\www.test.com\\error.php 出錯行號errline: 13 錯誤編號errno: 256 錯誤信息errstr: 人為觸發一個錯誤 出錯文件errfile: D:\\phpstudy\_pro\\WWW\\www.test.com\\error.php 出錯行號errline: 16 錯誤編號errno: 256 錯誤信息errstr: 人為觸發一個錯誤 出錯文件errfile: D:\\phpstudy\_pro\\WWW\\www.test.com\\error.php 出錯行號errline: 17 ~~~ 7之前一大弊端,某些錯誤是處理不了的 如果錯誤發生在腳本執行之前(比如編譯、文件上傳時),將不會 調用自定義的錯誤處理程序因為它尚未在那時注冊。 ~~~ //自定義的錯誤處理方法 function _error_handler($errno, $errstr ,$errfile, $errline) { echo "錯誤編號errno: $errno<br>"; echo "錯誤信息errstr: $errstr<br>"; echo "出錯文件errfile: $errfile<br>"; echo "出錯行號errline: $errline<br><br>"; } set_error_handler('_error_handler', E_ALL | E_STRICT); // 注冊錯誤處理方法來處理所有錯誤 foobar(3, 5); //調用未定義的方法將會產生一個Error級別的錯誤 ~~~ 結果未被自定義的函數捕獲 ~~~ Fatal error: Call to undefined function foobar() in D:\phpstudy_pro\WWW\www.test.com\error.php on line 19 ~~~ 使用set\_error\_handler()后,error\_reporting ()將會失效。也就是所有的錯誤(除上述的錯誤)都會交給自定義的函數處理。 例子:三種用法 ~~~ // 三種方法如下: 1: set_error_handler('NonClassFunction'); // 直接轉到一個普通的函數 NonClassFunction 2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 轉到 CallbackClass 類下的靜方法 StaticFunction 3: $o =new CallbackClass(); set_error_handler(array($o, 'CallbackFunction')); // 轉到類的構造函數, //可以這樣操作 class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, 'CallbackFunction')); // the & is important } function CallbackFunction() { // refers to $this } } new CallbackClass()-> CallbackClass(); ~~~ 例子2:通過觸發錯誤并以用戶自定義的程序來進行內部異常的處理 ~~~ `// error handler function function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { // This error code is not included in error_reporting, so let it fall //除非回調函數返回了FALSE,error_reporting()設置將不會起到作用 //返回false時,轉到標準PHP錯誤處理程序 return false; } switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } // 測試錯誤處理的函數 function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR); } if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING); return null; } $temp = array(); foreach($vect as $pos => $value) { if (!is_numeric($value)) { trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE); $value = 0; } $temp[$pos] = log($scale) * $value; } return $temp; } // set to the user defined error handler $old_error_handler = set_error_handler("myErrorHandler"); // trigger some errors, first define a mixed array with a non-numeric item echo "vector a\n"; $a = array(2, 3, "foo", 5.5, 43.3, 21.11); print_r($a); // now generate second array echo "----\nvector b - a notice (b = log(PI) * a)\n"; /* Value at position $pos is not a number, using 0 (zero) */ $b = scale_by_log($a, M_PI); print_r($b); // this is trouble, we pass a string instead of an array echo "----\nvector c - a warning\n"; /* Incorrect input vector, array of values expected */ $c = scale_by_log("not array", 2.3); var_dump($c); // NULL // this is a critical error, log of zero or negative number is undefined echo "----\nvector d - fatal error\n"; /* log(x) for x <= 0 is undefined, you used: scale = $scale" */ $d = scale_by_log($a, -2.5); var_dump($d); // Never reached ?>` 以上例程的輸出類似于: vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- vector b - a notice (b = log(PI) * a) <b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br /> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vector c - a warning <b>My WARNING</b> [512] Incorrect input vector, array of values expected<br /> NULL ---- vector d - fatal error <b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br /> Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)<br /> Aborting...<br /> ~~~ `set_error_handler`用來捕捉`trigger_error` `set_exception_handler`用來捕捉`throw new Exception` 這是設定一個全局的異常處理函數,在異常沒有被 try catch 處理時系統會將異常交于此函數處理 異常拋出但不使用 try catch 處理,系統會產生一個致命錯誤導致腳本退出執行, set_exception_handler 只是將沒有被 try catch 處理的異常進行捕捉,自定義一些友好的信息輸出,并不能阻止致命錯誤的產生,腳本依然會退出執行。 設置默認的異常處理程序,用于沒有用 try/catch 塊來捕獲的異常。 在`exception_handler`調用后異常會中止 set_error_handler 則會將用戶在腳本中觸發的錯誤攔截下來進行處理,而不再提交給系統,但它不會自動識別錯誤級別,我們需要手動判斷是否為 ERROR 級的進行退出,還是 WARNING 或 NOTICE 級的進行提示后繼續執行。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看