2011-09-24 38 views
5

我正在爲作業做一個小文件瀏覽器 - 而且我的工作和我需要的一樣好,但是我現在對PHP中的錯誤場景感到有點困惑,因爲我正試圖重構我的編碼。由於E_WARNING,我是否需要嘗試/捕獲PHP中的opendir?

我習慣了C++/C#try/catch錯誤處理,其中PHP似乎有一些變體。什麼是困惑我的是:

資源執行opendir(字符串$ PATH [,資源$背景])

成功則返回目錄句柄資源,或FALSE的失敗。

如果路徑由於權限限制或文件系統錯誤而無法打開 ,則opendir()返回 FALSE並生成級別爲E_WARNING的PHP錯誤。您可以通過在 函數名稱的前面加上'@'來抑制opendir()的錯誤輸出 。

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

我是否需要捕獲在那裏提到的E_WARNING級別生成的PHP錯誤,還是很愚蠢?我不明白爲什麼它會返回false並拋出一個錯誤 - 不應該錯誤拋出使它,所以你不正常返回?

+3

這是一個PHP內在不一致的例子,它絕對是一種*腳本*語言。你不會用try ... catch來捕捉警告。異常和錯誤/警告是兩種不同機制的組成部分,並且稍後會添加例外。這相當混亂。在PHP中非常小心謹慎地編寫代碼:您在C++/C#中的專家級語言是一致的,PHP不是。小心。 – gd1

+0

小心使用'@'來處理「錯誤」。這將抑制所有錯誤,而不僅僅是警告。查看PHP手冊中的提示:http://www.php.net/manual/en/language.operators.errorcontrol.php –

+1

我知道有一件有趣的事情發生在那裏。我讀到的第一個網站叫做E_WARNING,這個例外讓我感到困惑。謝謝你們。 –

回答

7

您將使用catch爲了處理提出的Exception。 PHP錯誤是不同的。 PHP錯誤有不同的級別或嚴重性。您可以使用error_reporting()來修改輸出哪些錯誤。爲了抑制在一份聲明中個別PHP錯誤,請使用@,如:@opendir(..)

1

警告只應在測試/接受環境中引發。您可以安全地檢查是否比較強存在,它與假

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

華林目錄可以用它可以將它寫入日誌文件,而不是顯示在屏幕上有一個自定義錯誤處理程序捕獲。

1

您可以用@ simbol像@opendir()那樣禁止警告。這是禁止資源處理程序警告的常見操作,因爲有些情況下資源不可用,但應該小心處理這些資源。

在現場環境中,您應該顯示錯誤消息,所以它只在開發過程中有用,但它可能會破壞您生成的頁面,因此可能會抑制它。

2

錯誤/以這種方式產生的警告,因此不能使用try/catch,因爲處理這些語言的基礎設施可以追溯到支持PHP前處理例外或try/catch

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

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

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

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

或者,如果您真的很無聊,您可以爲整個事情創建一個包裝,這會在撥打電話之前更改error_reporting()級別,並在之後再次設置。如果有必要,你甚至可以爲你拋出異常。

所以這些東西都可以做到,但不值得冒險;你可能只是認爲PHP的錯誤處理並不好,並且隨着時間的推移而發展,而不是像C++/C#那樣被認真考慮。

+0

這些解決方案都不符合Code Climate準則 –