亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

PHP主|例外

Feb 25, 2025 am 08:30 AM

PHP Master | Exceptional Exceptions

核心要點(diǎn)

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

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

錯(cuò)誤並非異常

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

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

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

“問(wèn)題”

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

全局捕獲

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

總結(jié)

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

(圖片來(lái)自 Fotolia)

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

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

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

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

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

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

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

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

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

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

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

  • 如何在 PHP 中處理多個(gè)異常?

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

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

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

  • 如何在 PHP 中記錄異常?

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

  • PHP 中的 PDOException 是什麼?

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(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

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
PHP變量範(fàn)圍解釋了 PHP變量範(fàn)圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問(wèn)題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪問(wèn)全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過(guò)濾;4.匿名函數(shù)需通過(guò)use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來(lái)源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來(lái)源通過(guò)token防止CSRF並通過(guò)finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問(wèn)上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過(guò)於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

如何通過(guò)php中的索引訪問(wèn)字符串中的字符 如何通過(guò)php中的索引訪問(wèn)字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開始,超出範(fàn)圍訪問(wèn)返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問(wèn)前應(yīng)檢查字符串長(zhǎng)度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語(yǔ)言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles