2010-07-12 57 views
10

我想知道關於在沒有參數的情況下引發異常的最佳做法。 在Python的官方文檔,你可以看到這一點:Python,發送一個沒有參數的異常

try: 
    raise KeyboardInterrupt 

http://docs.python.org/tutorial/errors.html第一章8.6)

,並在某些型動物代碼,像Django的或谷歌的代碼,你可以看到這一點:

def AuthenticateAndRun(self, username, password, args): 
    raise NotImplementedError() 

http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py

唯一的例外是同時沒有參數被升高之前實例化。 不帶參數實例化異常的目的是什麼?我應該使用第一種情況還是第二種情況?

在此先感謝 法比安斯基

回答

3

拋出一個異常類,而不是一個異常實例的被棄用的語法,不應該在新的代碼中使用。

raise Exception, "This is not how to raise an exception..." 
+0

對於那些好奇的人,請參閱http://www.python.org/dev/peps/pep-0352/#transition-plan瞭解有關與異常有關的棄用的更多信息。 – 2010-07-12 13:02:35

+8

我無法弄清楚您推薦的內容。你的代碼示例似乎是**不可**。也許你應該展示應該做什麼。 – 2010-07-12 14:47:15

+0

不知道應該做什麼。 – FrenchKheldar 2012-08-05 22:07:04

0

在像C++這樣的語言中,您可以引發任何對象,而不僅僅是Exceptions。 Python更受限制。如果你嘗試:

raise 1 

你得到:

Traceback (most recent call last): 
... 
TypeError: exceptions must be old-style classes or derived from BaseException, not int 

在Python編程模型,你通常可以通過單獨使用一類,而不是實例(這是很方便的用於快速創建獨特的情況下,只需定義一類)。因此,難怪你可以拋出一個異常類而不是異常實例。

不過像伊格納西奧說的那樣,這已經被棄用了。

此外,一些側面說明這不是直接的問題:

你也看到在一些代碼獨自撫養本身。沒有任何對象類或任何東西。它在異常處理程序中用於重新提升當前異常並保持最初的回溯。

3

你可以使用任何你喜歡的形式。沒有真正的區別,在Python 2和3中都是合法的。Python style guide沒有指定推薦哪一個。


日向 「級形式」 支持多一點信息:

try: 
    raise KeyboardInterrupt 

這種形式在兩個Python 2和3 從pep-3109摘錄完全合法:

加薪EXCEPTION被用來引發一個新的例外。此表單有兩個 子變體:EXCEPTION可能是異常類或 異常類的實例;有效的異常類是BaseException及其子類[5]。如果EXCEPTION是一個子類,它將被調用而沒有 參數來獲取異常實例。

也正是在Python documentation描述:

...如果它是一個類,需要通過 不帶參數的實例化類時,將獲得異常實例。