2016-04-22 22 views
2

我已經開源一個math library for PHP,定義其own hierarchy of exceptions我應該在庫中拋出PHP 7的錯誤類嗎?

現在PHP 7已經落地,我意識到一些例外覺得有點多餘的推出了全新的Error類:

讓我們忘了PHP 5一會兒,假設該庫僅以PHP 7爲目標。

  • 我應該丟掉ArithmeticError並放下我的ArithmeticException
  • 同樣,我應該扔DivisionByZeroError並下降DivisionByZeroException
  • 應該RoundingNecessaryExceptionNumberFormatException延伸ArithmeticError
  • 在這種情況下,他們應該被稱爲RoundingNecessaryErrorNumberFormatError

乍一看,重新聲明在語言中具有本機等價物的異常似乎很奇怪。

與此同時,雖然沒有什麼可以阻止用戶級代碼拋出Error,我覺得設計這些類通過PHP本身被拋出,而用戶空間的庫最好還是扔Exception而不是Error

在這個問題上有共識嗎?

+0

致投票結束的人:基於「對這個問題的答案投票結束問題將傾向於幾乎完全基於意見,而不是事實,參考或具體專業知識」。是適得其反的,有點「射擊使者」。即使我們決定以意見爲基礎的答案(什麼樣的答案*不是*)是壞事,那麼譴責答案*,而不是問題。試着去合作,呃?根據其整體價值判斷一個情況,而不是規則書中的誡命。如果你沒有任何有用的補充,只需慢跑即可。 –

+1

TBH,我知道這個問題將成爲「主要是基於觀點的」強迫選民的目標。我盡力爭取達成共識,而不是意見。也許創建[Throwable RFC](https://wiki.php.net/rfc/throwable-interface)的人寫了關於這個主題的東西。也許這是一個半官方的答案。誰知道。無論如何我需要問! – Benjamin

+1

PHP錯誤異常是在發生*程序員*錯誤的情況下引發的。拋出的任何錯誤都應該無可否認地鏈接到代碼中的實際錯誤。如果您使用Error或其子類匹配此約束,則可以在您的代碼中使用它們。 (這也意味着你不應該捕獲這些異常,除了在你的頂級處理程序或非常不尋常的情況下。如果你的異常應該被捕獲,那麼Error是不適合你的。) – NikiC

回答

1

你將會有Stack Overflow漸進式文字表達式來關閉它,因爲答案將是「主要基於觀點的」。由於某些原因,SO認爲這與其他一般也是基於意見的答案不一致或不同,因爲問題很少有一個答案。

這是一個合理的問題。

如果我們要將問題的範圍限制爲DivisionByZeroError和Arithmetic錯誤,那麼我認爲您應該遵循PHP的標準化,並利用這些錯誤。這讓你更加接近最簡單的原則,因爲它讓你的代碼與你自己的代碼的期望一致 - 例如 - 除以零。所以這是一件好事(我認爲可以客觀地說)。

但是 - 現在這是主觀的 - 我不會積極拋出這些錯誤,我只是讓我的代碼錯誤。IE:不要陷入困境並重新拋出同樣的錯誤,只會讓代碼錯誤。它簡化了您的代碼(目標),並具有相同的最終結果(目標)。所以這與你的本能有關,即不應該拋出這些內置錯誤。但僅僅因爲它沒有必要:PHP會爲你處理。我不會本質上說一個人不應該積極拋出這些錯誤,但我認爲它是合法的(甚至是必要的)將是一個非正統的情況,所以它可能會乞討的問題,如果它是正確的錯誤拋出。

至於像RoundingNecessaryException vs RoundingNecessaryError這樣的非特殊情況......我認爲將它們升級到錯誤是有意義的。我剛纔找不到文檔中的參考資料(其他人可能能夠更新此文檔?),但他們聲明錯誤是編程錯誤,開發人員需要更改代碼才能修復;並且異常僅用於特殊的運行時行爲。或者這個效果的話。所以如果你想讓你的方法可能會引發RoundingNecessaryError工作,那麼需要做必要的舍入。這是一個代碼時間的考慮,所以錯誤是有道理的。我認爲這有些微不足道,因爲對此沒有削減和干預的單一答案,但我認爲理由是相當客觀的。

+0

感謝您的回答。關於不主動拋出'DivisionByZeroError',這是不可能的,因爲我不是在底層使用'intdiv()',而是基於GMP,BCMath甚至普通PHP的不同計算器實現。我需要協調異常,以便保持實現細節。 – Benjamin

+0

關於'錯誤'是編程錯誤,這可能是有道理的,但我認爲這只是增加了一些混淆,因爲PHP已經在它的[異常層次結構]中爲此提供了類(http://php.net/manual/en /spl.exceptions.php):例如[LogicException](http://php.net/manual/en/class.logicexception.php)「代表程序邏輯中的錯誤,這種異常應直接導致修復你的代碼「。因此,對於類似的原因,我們現在有2個似是而非的throwable:'Error'和'LogicException'。這就是爲什麼我認爲,也許'錯誤'實際上應該只由PHP拋出? – Benjamin

+0

那裏有一些重疊。我只能猜測LogicException預先修改了PHP7引入的錯誤處理。此外,LogicException與DivisionByZeroError有些相似(或不同)。但我不能說真的。 PHP的錯誤處理方法一直讓我感到困惑。整個事情似乎有一個非常奇怪的方法。 –

相關問題