簡體   English   中英

由於E_WARNING,我是否需要在PHP中嘗試/捕獲opendir?

[英]Do I need to try/catch on opendir in PHP due to E_WARNING?

我正在為家庭作業制作一個小文件瀏覽器 - 我的工作和我需要的一樣好,但是我現在有點困惑處理PHP中的錯誤情況,因為我正在嘗試重構我的編碼。

我習慣了C ++ / C#try / catch錯誤處理,PHP似乎有一些變種。 令我困惑的是這個:

resource opendir(string $ path [,resource $ context])

成功時返回目錄句柄資源,失敗時返回FALSE。

如果path不是有效目錄或由於權限限制或文件系統錯誤而無法打開目錄,則opendir()將返回FALSE並生成級別為E_WARNING的PHP錯誤。 您可以通過在函數名稱的前面加上“@”來抑制opendir()的錯誤輸出。

來自http://php.net/manual/en/function.opendir.php

我是否需要捕獲那里提到的級別E_WARNING生成的PHP錯誤,還是愚蠢的? 我不明白為什么它會返回false並拋出一個錯誤 - 不應該拋出錯誤使它無論如何都不能正常返回?

您將使用catch來處理引發的Exception PHP錯誤是不同的。 PHP錯誤具有不同的級別或嚴重性。 您可以使用error_reporting()修改輸出哪些錯誤。 為了抑制語句中的單個PHP錯誤,請使用@ ,如: @opendir(..)

因此,使用try / catch不能處理以這種方式生成的錯誤/警告,因為處理它們的語言基礎結構可以追溯到PHP支持的異常或try / catch

當您使用更現代的PHP模塊時,您將真正能夠使用try / catch ,這些模塊使用類並生成異常而不是錯誤和警告。

PHP的大多數核心功能仍然基於舊的錯誤處理機制。

你應該用opendir()做的第一件事就是檢查目錄是否存在,並且在你嘗試打開之前可以打開它; 這將防止您需要使用opendir()本身處理錯誤條件。

如果您仍然對拋出警告持謹慎態度,可以使用@符號禁止警告。 請注意,這也會抑制真正的錯誤。

或者,如果你真的很無聊,你可以為整個事物創建一個包裝器,它會在調用之前更改error_reporting()級別,然后再將其設置回來。 如有必要,您甚至可以為它拋出異常。

所以這些事情都可以做到,但這不值得麻煩; 你也可以忍受這樣一個事實:PHP的錯誤處理不是很好,而且隨着時間的推移不斷發展,而不是像C ++ / C#那樣首先仔細考慮過。

警告只應在測試/接受環境中拋出。 您可以安全地檢查該目錄是否存在,並將其與false進行比較

if (opendir($dir) === false)
    echo "it failed!";

可以使用自定義錯誤處理程序捕獲警告,該錯誤處理程序可以將其寫入日志文件,而不是在屏幕上顯示它。

您可以使用@ simbol(如@opendir()來抑制警告。 這通常會抑制資源處理程序警告,因為有些情況下資源不可用,但這些應該小心處理。

在實時環境中,您應該關閉錯誤顯示,因此它僅在開發中有用,但它可能會破壞您生成的頁面,因此抑制它可能很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM