2012-01-15 23 views
1

我在改寫PEAR的Text_LanguageDetect例外的錯誤處理的過程中,真的不知道該怎麼在例外與動態數據做:PHP例外:在哪裏放置動態數據?

throw new Text_LanguageDetect_Exception(
    'Language database does not exist.', 
    Text_LanguageDetect_Exception::DB_NOT_FOUND 
); 

在這裏,我想包括文件名這是試圖打開,但問題是哪裏把它:

  1. Language database /path/to/file.ext does not exist.
  2. Language database "/path/to/file.ext" does not exist.
  3. Language database does not exist: /path/to/file.ext
  4. Language database does not exist: "/path/to/file.ext"

1 + 2是適當的英語句子,而3 + 4可以很容易到grep在碼的消息。另外,在3 + 4中更容易用代碼提取文件名。

我應該使用哪一個,爲什麼?


另一個問題是:我應該在哪裏放置文件名?

當我把它作爲例外消息時,如果他看到消息,它可能會向攻擊者提供有關服務器上文件結構的信息。如果沒有文件名,調試起來會更困難。

+2

因爲應在生產服務器上禁用錯誤消息,所以我沒有看到攻擊者獲得關於文件結構的信息。它不是組件編寫者有責任預測組件用戶的配置錯誤。關於我更喜歡​​哪個消息:4.除此之外,它是一個民意調查類型的問題,不適合我所猜測的。 – Gordon 2012-01-15 12:09:14

+3

使用'sprintf()',您可以更輕鬆地解耦和更改內容,同時保持代碼清潔。接下來,檢查整個組件的風格,以便始終保持相似,這將減少學習曲線。提供對您的API用戶有用的所有信息,以處理異常情況。 – hakre 2012-01-15 12:14:34

+0

可能的重複[如何編寫好的錯誤消息?](http://stackoverflow.com/questions/194537/how-does-one-write-good-error-messages) – hakre 2012-01-15 12:15:38

回答

0

您應該使用看起來更易讀的消息格式。在代碼中依賴異常消息並不是一個好習慣。如果你需要這樣做,你可能應該繼承這個異常。

第二個問題:你不應該在生產環境中向用戶顯示詳細的錯誤,所以我沒有看到包含文件名是一個問題。

-1

當拋出異常時,有一個envrionment變量可以告訴你的代碼是否處於開發或生存狀態。這可以設置存儲其他系統範圍設置的位置。

如果它被設置爲開發,那麼你輸出的錯誤會使調試更容易,如果它被設置爲活動,然後輸出對最終用戶有幫助的錯誤(或者根本沒有錯誤並正常處理),則不會提供任何信息將是攻擊者。

+0

這不回答他的問題。 – Gumbo 2012-01-15 12:05:56

+0

不適用於通用庫。梨是這樣的存儲庫。 – hakre 2012-01-15 12:13:01