欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP異常機制的流程及原理

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

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

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

對于一下代碼,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");   /* 我從不會以我的名字命名文件, 所以這個文件不存在 */  require("laruence.php");

運行結(jié)果:

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

首先, 我們要知道, Require在包含一個找不到的問題的時候, 會前后拋出倆個錯誤:

1. WARNING : 在PHP試圖打開這個文件的時候拋出。

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

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

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

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

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

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

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

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

這里有的同學(xué)要問了:”那set_exception_handler設(shè)置的異常默認(rèn)處理函數(shù)(user_exception_handler)什么時候起作用呢?” 是在執(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異常機制的流程及原理

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

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

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

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

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

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

廣告

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

微信小程序開發(fā)
未满十八周岁禁看视频| 一欧美一区二区三区| 久久久亚洲福利精品午夜| 欧美欧美一区二区三区| 天堂av在线一区二区三区| 亚洲欧美半夜激情一区二区| 国产精品综合av一区二区国产馆| 日本免费精品人成视频| 91最新精品丝袜国产在线| 日韩不卡的一区免费视频| 自拍一区日韩二区欧美三区| 插入内射视频在线观看| 国产a级一区二区三区| 成人黄色暖暖韩日视频| 国外男女性生活在线视频| 精品一区中文字幕少妇人妻| 国产国语网站在线观看| 欧美日韩在线视频第三区| 欧美日韩人美精品一区在线| 亚洲av乱码一区二区三| 97在线观看免费公开| 亚洲 精品一区二区| 91国产在线视频免费观看| 久久久久久这里都是精品| 欧美一区二区三区爽| 亚洲最色最黄大片在线视频| 变态另类欧美国产在线| 伊人欧美一区二区三区| 91在线播放国产视频| 黄色三级欧美一区二区| 美女露脸口爆吞精视频| 欧美国内日本一区二区| 日韩成人中文字幕在线视频| 日韩精品熟女中文字幕| 国产精品推荐在线观看| 日本一区中文字幕怎么用| 亚洲天堂免费观看av| 色综合色很天天综合色| 亚洲三区四区视频在线观看| 午夜毛片免费在线播放| 欧美色精品人妻在线最新|