乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一些簡單的錯誤處理函數(shù)(二)

       硬核項(xiàng)目經(jīng)理 2021-05-31

      一些簡單的錯誤處理函數(shù)(二)

      接下來,我們繼續(xù)學(xué)習(xí) PHP 中的錯誤處理函數(shù)。上次學(xué)習(xí)過的函數(shù)是錯誤信息的獲取、設(shè)置、發(fā)送等功能,今天學(xué)習(xí)的內(nèi)容主要是關(guān)于錯誤的捕獲相關(guān)的函數(shù)。

      set_error_handler()

      首先是大家可能會接觸過的一個函數(shù),它可以用來捕獲一些錯誤的信息。如果我們需要統(tǒng)一處理一些錯誤,比如規(guī)定日志格式或者將錯誤信息發(fā)送到郵件中,一般會在入口文件的開頭在全局范圍內(nèi)定義一個這個函數(shù)進(jìn)行統(tǒng)一的處理。

      echo $a; // Notice: Undefined variable: a ...
      //  E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 不能處理
      set_error_handler(function($errno, $errstr, $errfile, $errline){
          echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
      }, E_ALL | E_STRICT);

      echo $a; // Has Error:8,Undefined variable: a ...

      set_error_handler() 函數(shù)接收一個回調(diào)函數(shù)和一個錯誤接收的類型,它的函數(shù)簽名是:

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

      $error_handler是一個回調(diào)(匿名)函數(shù),這個函數(shù)內(nèi)部可以獲取到錯誤的等級、信息、文件、行數(shù)等

      handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool

      其中,$errcontext 已經(jīng)在 PHP7.2 之后取消了。

      \$error_types,用于錯誤接收的類型,就像 error_reporting() 函數(shù)定義的錯誤類型一樣,它用于控制 $error_handler 回調(diào)函數(shù)所能接收的錯誤的類型。

      需要注意的是,這個函數(shù)無法處理 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 這些類型的錯誤,也就是說,能夠中斷程序執(zhí)行的錯誤它都無法捕獲處理。

      另外,在函數(shù)調(diào)用之前的錯誤是無法捕獲到的,只有在函數(shù)調(diào)用之后的錯誤才能通過這個函數(shù)進(jìn)行捕獲處理。

      restore_error_handler()

      這個函數(shù)是用于還原之前的錯誤處理函數(shù)。比如我們在上面代碼下添加這個函數(shù),然后再次觸發(fā)錯誤,錯誤將會使用回 PHP 的標(biāo)準(zhǔn)處理程序。

      restore_error_handler();

      echo $a; // Notice: Undefined variable: a ...

      set_exception_handler()

      學(xué)習(xí)了上面錯誤處理的函數(shù)后,從名稱就可以看出,這個函數(shù)是用來處理異常的,它可以在全局范圍內(nèi)捕獲異常。

      set_exception_handler(function($ex){
          echo "Has Exception: " , $ex->getMessage(), PHP_EOL;
      });

      throw new Exception('Init Error');

      它的函數(shù)簽名是:

      set_exception_handler ( callable $exception_handler ) : callable

      只接收一個回調(diào)函數(shù),回調(diào)函數(shù)中只有一個參數(shù),是一個 Exception 類型的參數(shù)內(nèi)容,就和 try...catch 中的 catch 塊的參數(shù)一樣。在 PHP7 以后接收到的是一個 Throwable 類型的參數(shù)。也就是說,它可以捕獲到所有的錯誤和異常。

      不過需要注意的是,在 PHP 中,所有的異常如果不進(jìn)行處理,都會以中止腳本的錯誤形式返回報(bào)錯信息。所以,在 set_exception_handler() 內(nèi)處理完之后,腳本會中止運(yùn)行。即使后面還有代碼。所以,這個函數(shù)一般會用于全局捕獲一些異常、錯誤后進(jìn)行日志記錄,它不具有 try...catch 的能力,讓異常處理完成后還能繼續(xù)進(jìn)行其他操作。

      restore_exception_handler()

      同樣的,異常捕獲也是可以進(jìn)行回退的。

      set_exception_handler(function($ex){
          echo "Has Exception First: " , $ex->getMessage(), PHP_EOL;
      });
      set_exception_handler(function($ex){
          echo "Has Exception Second: " , $ex->getMessage(), PHP_EOL;
      });

      restore_exception_handler();

      throw new Exception('Init Error Next'); // Has Exception First: Init Error Next

      我們定義了兩個 set_exception_handler() 函數(shù),當(dāng)使用 restore_exception_handler() 后,拋出的異常將會進(jìn)入到第一個 set_exception_handler() 函數(shù)中進(jìn)行處理。同理,restore_error_handler() 函數(shù)如果定義了多個錯誤處理,使用 restore_error_handler() 后也會一級一級回退,直到最終使用 PHP 的錯誤處理流程進(jìn)行處理。

      trigger_error()

      最后,我們來看看如何手動拋出一個錯誤。就像上面例子中的 throw new Exception() 一樣,PHP 也提供了一個用戶自定義手動拋出錯誤的函數(shù)。

      trigger_error("I'm Error One!"); // Notice: I'm Error One! 

      它的函數(shù)簽名是:

      trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] ) : bool

      $error_msg,也就是這個錯誤的具體信息,長度限制為 1024 個字節(jié),如果超過了這個長度就會被截?cái)唷A硗?,如果這個信息中包含 HTML 實(shí)體標(biāo)簽的話,也不會直接轉(zhuǎn)義,在網(wǎng)頁顯示時(shí)需要使用 htmlentities() 來進(jìn)行處理。

      $error_type參數(shù)則是指定報(bào)錯的級別,默認(rèn)是 E_USER_NOTICE ,而且它只支持 E_USER... 相關(guān)的錯誤信息。也就是說,它的參數(shù)只能填三個 E_USER_NOTICE 、 E_USER_WARNING 、 E_USER_ERROR 。

      當(dāng)然,我們手動拋出的錯誤信息也是可以通過 set_error_handler() 進(jìn)行捕獲的。

      set_error_handler(function($errno, $errstr, $errfile, $errline){
          echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
      }, E_ALL | E_STRICT);
      trigger_error("I'm Error One!"); // Has Error:1024,I'm Error One!,...
      trigger_error("I'm Error Two!", E_USER_WARNING); // Has 512,I'm Error One!,...
      trigger_error("I'm Error Three!", E_USER_ERROR); // Has 256,I'm Error One!,...

      trigger_error("I'm Error Four!", E_WARNING); // Has Error:2,Invalid error type specified,...

      最后一個 trigger_error() 我們使用了 E_WARNING 類型,可以看出直接返回的內(nèi)容是 指定的錯誤類型無效 ,而不是我們定義的內(nèi)容。也就是說,這里是這個函數(shù)的參數(shù)類型錯誤的報(bào)錯,不是我們手動想拋出的錯誤了。

      總結(jié)

      其實(shí) PHP 的錯誤處理函數(shù)也就這些了,在 PHP7 下面,大部分錯誤都可以通過異常捕獲了,也就是說,PHP 越向后發(fā)展越會通過面向?qū)ο蟮姆绞絹硖幚磉@些錯誤信息。不過,我們依然還是要對他們有全面的了解,畢竟在 PHP 的版本更新中,短時(shí)間還不會完全的摒棄錯誤處理的場景,在之后我們學(xué)習(xí)詳細(xì)的異常處理相關(guān)的知識時(shí),說不定還會再次見到它們的身影。

      測試代碼:

      https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/%E4%B8%80%E4%BA%9B%E7%AE%80%E5%8D%95%E7%9A%84%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0%EF%BC%88%E4%BA%8C%EF%BC%89.php

      參考文檔:

      https://www./manual/zh/function.set-error-handler.phphttps://www./manual/zh/function.set-exception-handler.phphttps://www./manual/zh/function.restore-error-handler.phphttps://www./manual/zh/function.restore-exception-handler.php

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多