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

PHP主|例外

Feb 25, 2025 am 08:30 AM

PHP Master | Exceptional Exceptions

核心要點

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

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

錯誤并非異常

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

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

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

“問題”

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

全局捕獲

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

總結

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

(圖片來自 Fotolia)

關于 PHP 異常處理的常見問題

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 如何在 PHP 中記錄異常?

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

  • PHP 中的 PDOException 是什么?

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

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

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

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在PHP中實施身份驗證和授權? 如何在PHP中實施身份驗證和授權? 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中的文件上傳,核心在于驗證文件類型、重命名文件并限制權限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設置目錄權限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

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

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

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

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

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

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

我如何了解最新的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

如何設置PHP時區(qū)? 如何設置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