• 
    

      <address id="upfr9"><pre id="upfr9"><strike id="upfr9"></strike></pre></address>
      1. <address id="upfr9"><tr id="upfr9"></tr></address><dl id="upfr9"></dl>

        PHP異常機(jī)制的流程及原理

        本篇內(nèi)容介紹了“PHP異常機(jī)制的流程及原理”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

        成都創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

        PHP的異常機(jī)制的原理是什么?在PHP每一個(gè)可獨(dú)立執(zhí)行的op array***的ZEND_HANDLE_EXCEPTION是用來干什么呢?讓我們從一個(gè)問題說起。

        對(duì)于一下代碼,onError明明執(zhí)行了, 但是onException卻沒有執(zhí)行, 為什么呢?

        <?php function onError($errCode, $errMesg, $errFile, $errLine) {      echo "Error Occurred\n";      throw new Exception($errMesg);  }   function onException($e) {      echo $e->getMessage();  }   set_error_handler("onError");   set_exception_handler("onException");   /* 我從不會(huì)以我的名字命名文件, 所以這個(gè)文件不存在 */  require("laruence.php");

        運(yùn)行結(jié)果:

        Error Occurred  PHP Fatal error: main(): Failed opening required 'laruence.php

        首先, 我們要知道, Require在包含一個(gè)找不到的問題的時(shí)候, 會(huì)前后拋出倆個(gè)錯(cuò)誤:

        1. WARNING : 在PHP試圖打開這個(gè)文件的時(shí)候拋出。

        2. E_COMPILE_ERROR : 從PHP打開文件的函數(shù)返回失敗以后拋出。

        而我們知道, set_error_handler是不能捕獲E_COMPILE_ERROR錯(cuò)誤的。所以, 在onError中, 只能捕獲到***個(gè)WARNING錯(cuò)誤, 而在onError中拋出的異常, 為什么沒有被默認(rèn)exception_handler捕獲呢?這就要說說PHP的異常機(jī)制了.

        了解opcode的同學(xué)都知道, 在PHP5.3以前, 每一個(gè)可獨(dú)立運(yùn)行的op array(文件, 函數(shù), 方法)的***一條opcode都是ZEND_HANDLE_EXCEPTION, 而這個(gè)opcode是做什么用的呢?

        原來在PHP中, 當(dāng)有異常被throw的時(shí)候, 會(huì)跳到每一個(gè)op array的***一行, 來執(zhí)行這條ZEND_HANDLE_EXCEPTION, 偽碼如下:

        void on_throw_exception(zval *exception TSRMLS_DC) {  1. 判斷是否已經(jīng)有異常拋出  2. 記錄exception  3. 記錄下一條要執(zhí)行的op line的序號(hào)  4. 下一條要執(zhí)行的op line序號(hào) = 當(dāng)前op array的***一條  }

        就和改寫ip寄存器一樣, 改寫下一條要執(zhí)行的op line的序號(hào), 就改變了程序的流向, 這樣, 就會(huì)進(jìn)入到了ZEND_HANDLE_EXCEPTION的處理邏輯中.而在ZEND_HANDLE_EXCEPTION中, 會(huì)判斷這個(gè)異常是否在try catch中。

        ◆如果是,則把下一條要執(zhí)行的op line, 置為***個(gè)catch的op line, 并繼續(xù)執(zhí)行。

        ◆如果不是,則銷毀一些不需要的變量, 和opline, 然后直接結(jié)束執(zhí)行過程。

        這里有的同學(xué)要問了:”那set_exception_handler設(shè)置的異常默認(rèn)處理函數(shù)(user_exception_handler)什么時(shí)候起作用呢?” 是在執(zhí)行完成退出執(zhí)行LOOP以后才判斷是否有默認(rèn)異常處理函數(shù), 如果有才調(diào)用:

        //執(zhí)行  zend_execute(EG(active_op_array) TSRMLS_CC);  if (EG(exception)) {          if (EG(user_exception_handler)) {                   調(diào)用用戶定義的默認(rèn)異常處理函數(shù)           }       else {                   未捕獲的異常           }  }   else {       沒有異常        }  destroy_op_array(EG(active_op_array) TSRMLS_CC);  efree(EG(active_op_array));

        PHP異常流程

        PHP異常機(jī)制的流程及原理

        注: 圖中有一處不嚴(yán)謹(jǐn), 即在確定是否***一個(gè)catch塊的時(shí)候, 會(huì)同時(shí)判斷(is_a), 如果是才進(jìn)入***一個(gè)catch塊執(zhí)行。

        而PHP在遇到Fatal Error的時(shí)候, 會(huì)直接zend_bailout, 而zend_bailout會(huì)導(dǎo)致程序流程直接跳過上面代碼段, 也可以理解為直接exit了(longjmp), 這就導(dǎo)致了user_exception_handler沒有機(jī)會(huì)發(fā)生作用。了解到這些, 我想文章開頭的問題的為什么? 也就很清晰了吧?

        ***, 關(guān)于ZEND_HANDLE_EXCEPTION, 也許有同學(xué)會(huì)有疑問: 如果是這樣, 那為什么每一個(gè)可獨(dú)立執(zhí)行的op array***都有這個(gè)ZEND_HANDLE_EXCEPTION呢? 最簡單的, 如果一個(gè)函數(shù)中不會(huì)throw, 那么這個(gè)opcode是明顯不需要的? 你很聰明, PHP 5.3開始, 已經(jīng)按照你的想法調(diào)整了。只有在throw時(shí)刻, 才會(huì)動(dòng)態(tài)的生成ZEND_HANDLE_EXCEPTION opline.

        “PHP異常機(jī)制的流程及原理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

        網(wǎng)頁標(biāo)題:PHP異常機(jī)制的流程及原理
        文章路徑:http://www.jbt999.com/article26/iipicg.html

        成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、App設(shè)計(jì)、微信公眾號(hào)、靜態(tài)網(wǎng)站網(wǎng)站改版、域名注冊(cè)

        廣告

        聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

        微信小程序開發(fā)

      2. 
        

          <address id="upfr9"><pre id="upfr9"><strike id="upfr9"></strike></pre></address>
          1. <address id="upfr9"><tr id="upfr9"></tr></address><dl id="upfr9"></dl>
            午夜日韩av | 免费成人黄色电影网站 | 日韩无码传媒 | 欧美日韩成人在线 | 2021无码在线观看 | 成人ww| 大大鸡吧轻轻操在线视频 | 日日日大香蕉 | 国产乱伦视频一区二区 | 国产高清乱伦片 |