国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP主|例外

Feb 25, 2025 am 08:30 AM

PHP Master | Exceptional Exceptions

核心要點

  • PHP 異常是一種特殊的類,可以拋出和捕獲,表示意外事件。與不可恢復(fù)的錯誤不同,異常旨在由調(diào)用代碼處理,並沿執(zhí)行鏈向上冒泡,直到被捕獲。
  • PHP 錯誤和異常的區(qū)別在於:錯誤是不可恢復(fù)的,發(fā)生在主執(zhí)行循環(huán)中,表示代碼或環(huán)境穩(wěn)定性存在問題;而異常是可恢復(fù)的,可能發(fā)生在主執(zhí)行循環(huán)之外,並且不表示系統(tǒng)不穩(wěn)定。
  • 不是所有非成功的情況都需要拋出異常。只有在確實無法繼續(xù)執(zhí)行時才應(yīng)拋出異常。這意味著一個不屬於普通操作或標(biāo)準(zhǔn)的動作,一個異常,與正常和預(yù)期情況有所偏差。
  • 拋出一般的 Exception 等同於說存在“問題”,而代碼無法知道發(fā)生了什麼。相反,應(yīng)始終拋出自定義異常,以告知調(diào)用代碼當(dāng)前情況,從而對發(fā)生的情況進(jìn)行細(xì)粒度控制。
  • 全局捕獲塊是最高級別的捕獲塊,必須捕獲所有冒泡到該級別的異常。它應(yīng)該是生產(chǎn)代碼中唯一的一般異常處理程序。其他處理程序必須是特定的,並且僅限於它知道如何處理和負(fù)責(zé)的異常。

PHP 5 引入了異常處理機(jī)制,這是一種特殊的類,可以拋出和捕獲(與引發(fā)的錯誤相反),表示意外事件。與錯誤不同,異常旨在由調(diào)用代碼處理,並沿執(zhí)行鏈向上冒泡,直到被捕獲。一旦拋出異常,當(dāng)前作用域中的代碼將停止執(zhí)行(因此,throw 語句之後的任何行都不會執(zhí)行),控制權(quán)將返回到第一個匹配的異常處理程序(捕獲塊、配置的異常處理程序或語言提供的異常處理程序)。只有當(dāng)異常被捕獲時,代碼執(zhí)行才會從那裡繼續(xù)。本文並非旨在從入門級別講解異常,而是就如何更好地使用異常提供一些建議。如果您以前從未使用過異常,您可能需要查閱PHP 手冊,或閱讀我的朋友們編寫的《PHP Master:編寫尖端代碼》一書,該書出色地講解了編寫現(xiàn)代、合理的PHP 代碼所需的一切知識。

錯誤並非異常

您可能已經(jīng)了解了異常,但您可能想知道 PHP 錯誤和(自定義)異常之間的區(qū)別。邏輯實際上很簡單:錯誤是不可恢復(fù)的,發(fā)生在主執(zhí)行循環(huán)中,並且表示環(huán)境的穩(wěn)定性。例如,如果您嘗試將標(biāo)量值作為數(shù)組訪問而引發(fā)了 E_NOTICE,則表示您的代碼存在問題。無法保證繼續(xù)執(zhí)行是安全的。無法在執(zhí)行期間糾正該條件。如果由於解析器發(fā)現(xiàn)意外的 T_IF 而引發(fā)了 E_PARSE,那麼您就會明白這如何影響事物的穩(wěn)定性。另一方面,異常是可恢復(fù)的,可以(並且通常會)發(fā)生在主執(zhí)行循環(huán)之外,並且不會指示系統(tǒng)的穩(wěn)定性。它是一個組件說:“我無法使用給定的輸入完成您的請求,因此您可以隨意處理該信息?!比绻麕鞉伋?code>LengthException,則表示傳遞的值過長或過短,因此它無法使用當(dāng)前值完成給定的指令。這並不意味著您的環(huán)境不穩(wěn)定,只是意味著您的代碼必須通過填充或截斷來調(diào)整值的長度。您的代碼可以捕獲此異常,更新值,然後重試。

並非所有異常都是例外情況

這是最難回答的問題之一:究竟什麼情況需要拋出異常?當(dāng)然,您的異常必須符合上一段中的三個規(guī)則。當(dāng)遇到損壞的內(nèi)存時拋出異常是非常糟糕的做法。您的代碼應(yīng)該改為引發(fā)錯誤,以便 PHP 能夠盡快中止,因為事實證明,環(huán)境不安全以繼續(xù)執(zhí)行。但是,即使錯誤是不必要的,也不是所有非成功的情況都需要異常。也就是說:並非所有不成功的情況都是例外情況。 “異常”這個詞指的是不屬於普通操作或標(biāo)準(zhǔn)的動作,一個異常,與正常和預(yù)期情況有所偏差。一位前同事曾經(jīng)在晚餐時告訴我他們公司使用的 XML/RPC 服務(wù)的設(shè)計情況,該服務(wù)是所有面向公眾的操作的支柱。架構(gòu)師隨後了解了異常以及它們在指示非成功狀態(tài)方面的便利性。該支柱除了其他功能外,還提供了單點登錄功能。 Web 應(yīng)用程序不會直接訪問數(shù)據(jù)庫,而是查詢 XML/RPC 服務(wù),然後該服務(wù)將根據(jù)為所有 Web 應(yīng)用程序提供服務(wù)的集中式數(shù)據(jù)存儲進(jìn)行回復(fù)。當(dāng)提供有效的憑據(jù)時,將返回成功狀態(tài)。當(dāng)出現(xiàn)問題時,將拋出異常,並顯示一條消息,指示失敗的原因。易於捕獲,您可以以醒目的、閃亮的錯誤消息向用戶顯示該消息。但是,用戶提供不正確的用戶名和/或密碼真的偏離了預(yù)期嗎?在我的項目中,我處理的用戶並不完美,他們會打錯字或忘記事情。獲取不正確的憑據(jù)是非常常見的,甚至比有效的憑據(jù)更常見。驗證憑據(jù)是登錄系統(tǒng)的預(yù)期行為,因此在這種情況下,XML/RPC 服務(wù)應(yīng)返回一個狀態(tài),指示驗證的成功與否。儘管憑據(jù)未通過,但驗證過程本身仍然成功執(zhí)行。如果驗證過程未正確執(zhí)行,則說明還有其他問題。也許數(shù)據(jù)存儲不可訪問,或者其他什麼原因。登錄系統(tǒng)無法連接到其數(shù)據(jù)存儲的情況非常不常見,因為它無法在沒有數(shù)據(jù)存儲的情況下運(yùn)行。因此,這需要拋出異常。注意:有些人可能會爭辯說,登錄系統(tǒng)無法連接到數(shù)據(jù)存儲是環(huán)境不穩(wěn)定的標(biāo)誌,因此應(yīng)該引發(fā)錯誤。但是,登錄系統(tǒng)不負(fù)責(zé)為數(shù)據(jù)存儲引發(fā)錯誤。相反,如果數(shù)據(jù)存儲連接器/包裝器認(rèn)為有必要,則應(yīng)引發(fā)錯誤。一般來說,您可以將異常視為開發(fā)人員必須介入、查看情況並進(jìn)行處理的情況。發(fā)生異常場景的代碼本身無法做到這一點。這可能是開發(fā)人員已經(jīng)查看過代碼,並且他們處理它的方式是在它發(fā)生時讓它發(fā)生。不要開始將所有異常都通過郵件發(fā)送給網(wǎng)絡(luò)運(yùn)營中心;他們不會感激的!處理您可以並且應(yīng)該處理的內(nèi)容,並且只有在確實無法繼續(xù)執(zhí)行時才拋出異常。

“問題”

幾年前,當(dāng)我徒步旅行穿過歐洲時,我在希臘的一個火車站偶然發(fā)現(xiàn)了一個令人難忘的景象。其中一個儲物櫃區(qū)域看起來像炸彈爆炸了一樣,門散落在地上,一半掛在鉸鏈上,或者被砸碎了。我後來了解到他們正在拆除儲物櫃區(qū)域,但值得注意的是,他們是如何向客戶傳達(dá)此區(qū)域已停用的。在中央部分貼了很多膠帶,上面貼著一張紙,上面寫著“問題”兩個字。從技術(shù)上講,這是完全正確的。儲物櫃顯然出了問題,並且情況已通過向客戶傳達(dá)來處理。您可能會覺得它很有趣,但實際上您在代碼中經(jīng)常會看到這種情況。如果您只拋出 Exception,那麼您基本上就是在說“問題”,而代碼無法知道發(fā)生了什麼。雖然 Exception 是每個異常的基類,但您可以使用您自己的類型擴(kuò)展它。在 SPL 庫中可以找到更廣泛的異常集合,但這遠(yuǎn)非極限。查看 Zend Framework 或 Symfony 等主要的 PHP 框架,您會發(fā)現(xiàn)它們幾乎為每種不同的情況都使用自定義異常。編寫所有這些文件以便可以動態(tài)加載它們並維護(hù)所有不同類型有點麻煩,但這為框架和該框架的使用者提供了對發(fā)生情況的細(xì)粒度控制。如果只拋出 Exception,那麼您只能確定某些事情不對勁,您不妨放棄。這意味著您使用異常的方式就像它們是錯誤一樣,將捕獲塊用作靜默操作符,並且只是放棄了有人可以以某種方式糾正這種情況的希望。

全局捕獲

如果使用非自定義異常和捕獲所有可能的異常是一個壞主意,那麼為什麼語言甚至允許這樣做呢?始終使用和捕獲特定異常的規(guī)則有一個例外,那就是全局捕獲規(guī)則。全局捕獲塊是最高級別的捕獲塊,必須捕獲所有冒泡到該級別的異常。 PHP 本身包含一個(您是否見過“致命錯誤:未捕獲的異常在……”消息?),但您可以使用自定義處理程序覆蓋它以作為後備。您可以使用 set_exception_handler() 函數(shù)設(shè)置此處理程序,因此您可以隨意這樣做,然後向您的 PHPMD 規(guī)則集中添加一條規(guī)則,禁止類似於“catch (Exception $e) {”之類的行。這是唯一一個應(yīng)該在生產(chǎn)代碼中找到的一般異常處理程序的原因,它捕獲尚未捕獲的 Exception 類的每個實例。其他處理程序必須是特定的,並且僅限於它知道如何處理和負(fù)責(zé)的異常。在這裡謹(jǐn)慎行事,讓一個可處理的異常冒泡一次(然後在代碼中修復(fù)它)肯定比捕獲太多並充當(dāng)靜默操作符要好得多。

總結(jié)

總而言之,只有當(dāng)您的代碼無法使用給定的輸入完成請求的指令時才拋出異常,始終拋出自定義異常,該異常實際上會告訴調(diào)用代碼當(dāng)前情況,並且如果您調(diào)用其他代碼,則只捕獲您可以並且應(yīng)該處理的異常。這將使您的組件更少像黑盒(自定義異常),並減少集成您的組件的開發(fā)人員必須更改您的代碼的可能性(不要捕獲您不應(yīng)該捕獲的異常)。我們總是告訴我們的客戶/管理人員要具體,但我們也應(yīng)該具體!

(圖片來自 Fotolia)

關(guān)於 PHP 異常處理的常見問題

  • PHP 異常處理的目的是什麼?

PHP 異常處理是一種強(qiáng)大的機(jī)制,允許開發(fā)人員管理程序執(zhí)行期間可能發(fā)生的錯誤和異常情況。它提供了一種將控制從程序的一個部分轉(zhuǎn)移到另一個部分的方法。 PHP 異常處理用於在發(fā)生指定錯誤時更改代碼執(zhí)行的正常流程。這可以使代碼更易於閱讀和管理,因為它將錯誤處理代碼與主程序邏輯分開。

  • PHP 中的 try-catch 塊是如何工作的?

在 PHP 中,try-catch 塊用於處理異常。 try 塊包含可能拋出異常的代碼,而 catch 塊包含如果 try 塊中拋出異常將執(zhí)行的代碼。如果 try 塊中拋出異常,則腳本停止運(yùn)行,控制權(quán)將傳遞給與拋出的異常類型匹配的第一個 catch 塊。

  • finally 塊在 PHP 異常處理中的作用是什麼?

PHP 異常處理中的 finally 塊用於確保始終執(zhí)行一段代碼,無論是否拋出異常。這對於清理活動(例如關(guān)閉文件或數(shù)據(jù)庫連接)非常有用,無論操作成功還是失敗都應(yīng)執(zhí)行這些活動。

  • 如何在 PHP 中創(chuàng)建自定義異常?

在 PHP 中,您可以通過擴(kuò)展內(nèi)置的 Exception 類來創(chuàng)建自定義異常。這允許您向異常添加自定義功能,或創(chuàng)建特定於應(yīng)用程序域的異常。要創(chuàng)建自定義異常,您可以定義一個擴(kuò)展 Exception 的新類,然後添加所需的任何自定義方法或?qū)傩浴?

  • PHP 中異常和錯誤有什麼區(qū)別?

在 PHP 中,錯誤是一個嚴(yán)重的問題,會阻止腳本運(yùn)行,而異常是一個改變正常執(zhí)行流程的條件。錯誤通常是由語法錯誤或調(diào)用未定義函數(shù)等原因引起的。另一方面,異常通常用於處理對程序並非致命但需要特殊處理的條件。

  • 如何在 PHP 中處理多個異常?

在 PHP 中,您可以使用多個 catch 塊來處理多個異常。每個 catch 塊處理特定類型的異常。當(dāng)拋出異常時,將按代碼中出現(xiàn)的順序檢查 catch 塊。將執(zhí)行第一個能夠處理拋出的異常類型的 catch 塊。

  • 我可以在 PHP 中重新拋出異常嗎?

是的,您可以在 PHP 中重新拋出異常。如果您想以某種方式處理異常,但又想讓更高級別的異常處理程序捕獲它,這將非常有用。要重新拋出異常,只需在 catch 塊中使用 throw 語句即可。

  • 如何在 PHP 中記錄異常?

在 PHP 中,您可以通過在 catch 塊中使用 error_log 函數(shù)來記錄異常。這允許您將有關(guān)異常的信息(包括其消息和堆棧跟蹤)記錄到指定的日誌文件中。

  • PHP 中的 PDOException 是什麼?

PDOException 是一種異常,當(dāng) PDO 操作中發(fā)生錯誤時會拋出該異常。 PDO(PHP 數(shù)據(jù)對象)是一個數(shù)據(jù)庫抽象層,它為訪問 PHP 中的數(shù)據(jù)庫提供一致的接口。 PDOException 提供有關(guān)錯誤的信息,包括 SQLSTATE 錯誤代碼和數(shù)據(jù)庫驅(qū)動程序的錯誤消息。

  • 如何在 PHP 中處理未捕獲的異常?

在 PHP 中,您可以通過定義自定義異常處理程序函數(shù),然後使用 set_exception_handler 函數(shù)將其設(shè)置為默認(rèn)異常處理程序來處理未捕獲的異常。每當(dāng)拋出未被 try-catch 塊捕獲的異常時,都會調(diào)用此函數(shù)。

以上是PHP主|例外的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用於變量,字符串?dāng)?shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用於數(shù)字及類似字符串;4.除法用/號,需避免除以零,並註意結(jié)果可能是浮點數(shù);5.取模用%號,可用於判斷奇偶數(shù),處理負(fù)數(shù)時餘數(shù)符號與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles