久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      分析PHP錯誤處理(核心特性)

      分析PHP錯誤處理(核心特性)

      錯誤與異常

      錯誤,可以理解程序本身的錯誤,例如語法錯誤。而異常則更偏向于程序運(yùn)行不符合預(yù)期或者不符合正常流程;對于 PHP 語言而言,處理錯誤和處理異常使用的機(jī)制完全不同,因此很容易讓人產(chǎn)生困惑。

      例如,我們希望通過捕獲異常來處理除數(shù)為 0 的情況,但是在捕獲到異常之前,PHP 就觸發(fā)了錯誤。

      try {     $a = 5 / 0; } catch (Exception $e) {     $e->getMessage();     $a = -1;  // 通過異常來處理 $a 為 0 的情況,但是實(shí)際上,捕獲不到該異常 }  echo $a; // PHP Warning:  Division by zero

      也就是說,PHP 將除數(shù)為 0 的情況當(dāng)成了錯誤而觸發(fā),而不會自動拋出異常,因此沒法捕獲。類似的,在很多情況下,PHP 都沒辦法自動拋出異常。只能通過 if – else 語句判斷再結(jié)合 throw 方法來并手動拋出異常。

      上述情況的發(fā)生,主要還是因?yàn)楫惓C(jī)制是 PHP 向面向?qū)ο笱葸M(jìn)后得到的產(chǎn)物。而在此之前 PHP 的報錯主要還是通過錯誤機(jī)制,因此,在很多情況下,PHP 的錯誤要比異常更有價值。不過 PHP7 開始統(tǒng)一這兩者,使錯誤也可以像異常那樣拋出(這部分內(nèi)容將放在異常部分講解)。

      錯誤級別

      PHP 中的錯誤可理解為 使腳本不運(yùn)行不正常的情況,根據(jù)錯誤級別從高到低可劃分為五類

      1.Parse error Syntax Error – 語法解析錯誤,觸發(fā)該錯誤后,腳本完全無法運(yùn)行;

      2.Fatal Error – 致命錯誤,觸發(fā)該錯誤后,后面的腳本無法繼續(xù)執(zhí)行;

      3.Warning Error – 出現(xiàn)比較不恰當(dāng)?shù)牡胤?,腳本可繼續(xù)執(zhí)行;

      4.Notice Error – 出現(xiàn)不恰當(dāng)?shù)牡胤?,但是程度?Warning Error 低,腳本可繼續(xù)執(zhí)行;

      5.Deprecated Error – 不推薦這么使用,未來可能會廢棄,腳本可繼續(xù)執(zhí)行;

      默認(rèn)情況下,PHP 觸發(fā)錯誤,并顯示錯誤的級別及對應(yīng)的提示。

      Parse Error 示例 – 語句結(jié)尾不寫分號

       echo "abc" // PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';

      Fatal Error 示例 – 使用不存在的函數(shù)

       echo "beforen";  foo();  echo "after"; // 本行無法繼續(xù)執(zhí)行  // before  // PHP Fatal error:  Uncaught Error: Call to undefined function foo()

      Warning Error 示例 – 引入不存在的文件

      $a = "foo"; include('bar.php'); echo $a; // 程序繼續(xù)執(zhí)行 // PHP Warning:  include(bar.php): failed to open stream: No such file or directory ... // foo Notice Error 示例 - 輸出不存在的變量  echo $foo; echo 12345; // PHP Notice:  Undefined variable: foo // 12345

      Deprecated Error 示例 – 在一些字符串函數(shù)中傳入數(shù)字而非字符串

       strpos('12345', 3);  // PHP Deprecated:  strpos(): Non-string needles will be interpreted as strings in the future

      除了默認(rèn)觸發(fā)消息外,用戶也可以使用 set_error_handler 函數(shù)自定義錯誤處理,大多數(shù)錯誤類型都可以進(jìn)行自定義處理,除了 E_ERRORE_PARSE、 E_CORE_ERROR、 E_CORE_WARNINGE_COMPILE_ERROR、 E_COMPILE_WARNING 外。

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

      示例

      <?php // E_ALL - 處理全部錯誤類型 set_error_handler('customError', E_ALL);  /**  * @param  int $errno 錯誤的級別  * @param  string $errstr  錯誤的信息  * @param  string $errfile 錯誤的文件名(可選)  * @param  string $errline 錯誤發(fā)生的行號(可選)  */ function customError(int $errno, string $errstr, string $errfile, string $errline) {     echo sprintf('錯誤消息為 %s', $errstr); }  $a = 5 / 0;  // 錯誤消息為 Division by zero

      用戶也可以通過 trigger_error 函數(shù)來手動觸發(fā)一個用戶級別的錯誤(E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED)。

      function division($a, $b) {     if($b == 0){         @trigger_error("0 不能作為除數(shù)", E_USER_NOTICE);         return -1;     }     return $a / $b; }  echo division(10, 0);

      與錯誤有關(guān)的配置

      一些錯誤處理相關(guān)的常用配置

      error_reporting – 設(shè)置錯誤的報告級別

      display_errors – 是否顯示錯誤

      display_startup_error – 是否顯示 PHP 啟動過程中的顯示

      log_errors – 設(shè)置是否將腳本運(yùn)行的錯誤信息記錄到服務(wù)器錯誤日志或者 error_log 之中

      《Modern PHP》提出了四個規(guī)則

      ● 一定要讓 PHP 報告錯誤;

      ● 在開發(fā)環(huán)境中要顯示錯誤;

      ● 在生產(chǎn)環(huán)境中不能顯示錯誤;

      ● 在開發(fā)環(huán)境和生產(chǎn)環(huán)境中都要記錄錯誤;

      開發(fā)環(huán)境推薦配置

       display_errors = On  display_startup_error = On  error_reporting = -1  log_errors = On

      生產(chǎn)環(huán)境推薦配置

      display_errors = Off display_startup_error = Off ; 報告 Notice 以外的所有錯誤 error_reporting = E_ALL & ~E_NOTICE log_errors = On

      Symfony 編碼規(guī)范相關(guān)

      異常和錯誤消息字符串必須使用 sprintf 來進(jìn)行拼接;

      throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));

      當(dāng)錯誤類型為 E_USER_DEPRECATED 時,需要添加 @

      @trigger_error("foo", E_USER_DEPRECATED);

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號