2016-05-16 46 views
0

我在一個Python論壇上讀到一個有趣的引用,它「容易要求原諒而不是要求權限」。我對語言不太熟悉,所以我不能說這是否是垃圾。從使用.NET開始,我的理解是try catch是一個昂貴的操作,應該只在異常情況下才能使用。有點像安全網。在php中使用try catch而不是檢查權限

這種類型的行爲與PHP是否有任何優點?如在中,從try catch中的文件讀取更快,而在執行讀取操作之前檢查是否可以找到/讀取文件。我可以看到它是如何使代碼更容易維護,但是這會影響代碼的性能。當99.9%的支票毫無意義時,檢查更爲浪費。

回答

1

據我所知,這不是PHP中的標準做法。這在很大程度上是因爲大多數PHP內置函數拋出PHP 錯誤 - 不是例外! - 在PHP 7.0之前。 PHP try/catch塊無法捕獲PHP錯誤,因此必須對可能失敗的函數使用顯式檢查。

如果您的代碼需要與PHP 5.6或更早版本兼容,則不能使用此約定。如果您可以爲您的代碼授權PHP 7.0或更高版本,可能值得嘗試一下,但我不知道這可能會對性能產生什麼影響。

0

嘗試和捕捉本身是非常昂貴的。即使它沒有被使用(即不會產生異常),仍然有一些開銷被「嵌入」到生成的程序集中。至於簡單的檢查文件是否存在並且可以訪問,同樣的事情發生:這兩件事都是系統調用,通常更昂貴。但是,您也應該考慮對文件的讀取操作也是系統調用。

現在問題被縮減爲更昂貴的:2個系統調用或1個系統調用與異常處理。我在這裏的假設(我對此有些自信)是在異常實際被拋出的情況下,後者會更加昂貴,但在其他情況下更快。既然你已經指出在大多數情況下訪問文件沒有問題,那麼你可能會「應該」使用這些異常。處理錯誤更容易,並且使代碼更漂亮一些(儘管這是可以爭論的)。

更多關於代碼的事情:它完全取決於你的框架現在的樣子以及你想要它的樣子。事實上,你可以創建一個能夠以這兩種方式處理所有這些東西的類,並且它們都將看起來很乾淨(如果正確完成)並且易於維護。但是,如果你不想將它保存在一個單獨的類(或單獨的文件\函數\宇宙)中,我會去處理異常。

最後,如前所述,在你的情況下,異常處理通常會更快,但問自己一個問題:它有多大的問題?你是否每頁訪問執行一次操作,還是多次執行操作?該頁面是經常訪問還是每天只訪問一次?與所有其他網頁\算法相比,這會產生多少影響。有一個很好的概念,知道90/10規則:90%的代碼被執行10%的時間,反之亦然。如果這個特定的代碼在90%以內,你甚至不應該擔心性能,因爲你的擔心應該是其他10%的代碼。 (您可以閱讀更多關於此)

還有一件事:正如duskwuff指出的,無論這裏寫的是什麼PHP版本> = 7.0