2009-07-03 67 views
4

我不知道如果例外工作,每一種語言相同的方式,但我使用PHP,當我在做這樣的事情我想知道:對異常使用代碼。有用?

if (!$this->connection[0]->query($this->query)) 
throw new QueryFailedException($this->connection[0]->error); 

是否有必要在提供一個代碼第二個參數?例如:

if (!$this->connection[0]->query($this->query)) 
throw new QueryFailedException($this->connection[0]->error,123); 

現在的代碼是123 ...我想不出有必要這樣做。有一個嗎?在這種情況下,消息包含查詢,異常名稱是QueryFailedException,它解釋了異常類型,異常本身包含文件,行和堆棧跟蹤,因此,我無法想到任何可以使用代碼的地方。

+0

可能重複[我們需要什麼異常代碼?任何用例場景?](http://stackoverflow.com/questions/5868733/what-do-we-need-exception-code-for-any-use-case-scenario) – robsch 2015-03-23 13:03:26

回答

11

錯誤代碼是當沒有面向對象的語言時使用的一個特性。唯一可以幫助你理解錯誤代碼的是錯誤代碼。在面向對象的語言中,對象是你的錯誤代碼。 除非在特定情況下,不止一件事物可能會拋出完全相同的錯誤,並且它們以不同方式處理,否則請放棄它。 另外,如果您留下了一條消息而不是無意義的錯誤代碼,那麼您將爲任何正在調試代碼的人提供更好的解釋,因此如果您覺得異常需要更多信息,請填寫錯誤消息字段。

10

錯誤代碼是一個可用於提供更詳細信息的字段。例如,如果你有兩件事情可以產生相同的異常,那麼代碼可以用來給出更多的細節。

4

如果您有一個對錯誤代碼起作用的「錯誤源」,並且將它「提升」爲異常,則可以將異常中的實際錯誤代碼包含在內。 a)它沒有任何傷害,b)也許你不想爲每個可能發生或可能不發生的單個錯誤代碼設置一個異常類(在運行系統中幾乎沒有人關心)。
讓我們以MySQL server errors爲例。您可以爲每個代碼創建一個類別

class MySQLException_ER_HASHCHK extends MySQLException 
class MySQLException_ER_NISAMCHK extends MySQLException 
class MySQLException_ER_NO extends MySQLException 
class MySQLException_ER_YES extends MySQLException 
class MySQLException_ER_CANT_CREATE_FILE extends MySQLException 
class MySQLException_ER_CANT_CREATE_TABLE extends MySQLException 
class MySQLException_ER_CANT_CREATE_DB extends MySQLException 
class MySQLException_ER_DB_CREATE_EXISTS extends MySQLException 
class MySQLException_ER_DB_DROP_EXISTS extends MySQLException 
.... 

但實際上......誰關心?誰真的會單獨抓住他們?在幾乎所有情況下,應用程序的代碼中只會有一個 catch(MySQLException $ mex),也許,也許它只是尋找一個特定的代碼,它使編碼器幾乎沒有區別,無論有兩個catch-block還是一個if/switch塊。現在你有很多「死」的課,除了解析器之外,沒有人會對它們做出任何評論。 (另一方面,「值得做的事情都值得做得過分」)
即使你確實提供了一些粒度,我認爲超越例如有一個例外類每個SQLSTATE(?這是否有意義SQLSTATE不知道,只是一個例子)

class MySQLException_HY000 extends MySQLException 
class MySQLException_HY001 extends MySQLException 
class MySQLException_XA100 extends MySQLException 
class MySQLException_XA102 extends MySQLException 

再然後,你可能要包括的錯誤代碼 - 爲什麼失去這些信息即使/即使您的代碼通常不評估它?

1

如果可以的話,在異常代碼中設置是非常好的。 也就是說,如果您不更改代碼以基於從數據庫中獲得的數據拋出不同的異常。 OOP中的錯誤代碼是異常類名稱本身,因此您可以在一個try中解釋它們中的每一個,但具有多個catch子句。

try { 
    // code here 
} catch (AccessDeniedException $e) { 
// do something 
} catch (Exception $e) { 
    // do something else 
}