2009-12-10 46 views
2

注意:我編輯了我的Q(在標​​題中),以便更好地反映我真正想知道的內容。在我的Q的原始標題和文本中,我提到了拋出異常的來源;我的意思,以及我應該提到的,正如在下面的一個高度緊張但有用的迴應中指出的那樣,模塊異常類在中定義。這一點可以從以下事實中得到證明:正如在下面的答案中的一個答案中指出的那樣,原始Q的答案是異常分別從對cursor.execute和cursor.next的調用中拋出 - 當然,這不是您需要寫入try/except塊的信息。如何確定模塊特定的異常類定義

對於實例(Q具有什麼特別的SQLite或PySQLite模塊做):

from pysqlite2 import dbapi2 as SQ 

try: 
    cursor.execute('CREATE TABLE pname (id INTEGER PRIMARY KEY, name VARCHARS(50)') 
except SQ.OperationalError: 
    print("{0}, {1}".format("table already exists", "... 'CREATE' ignored")) 
cursor.execute('SELECT * FROM pname') 
while 1: 
    try: 
     print(cursor.next()) 
    except StopIteration: 
     break 

我讓這兩個片段錯誤出去看拋出異常,然後對try/finally塊進行編碼 - 但是沒有告訴我有關定義異常類的模塊。在我的例子中,只有一個導入的模塊,但在那裏有更多,我有興趣知道一個有經驗的pythonista如何識別異常源(search-the-docs-until-i-happen-to-find-it)我目前的方法)。

[和是的,我知道有上SO幾乎相同的問題 - 但對於C#,而不是蟒蛇,再加上如果你讀了作者的編輯的版本,你會看到他有一點不同的問題。]

回答

5

第二[[拋出異常]從一個Python核心模塊

題:它是從一個呼叫拋向cursor.next恰好像第一個從呼叫被拋向cursor.execute - 很難說爲什麼你會禿頂這個反事實,但與事實仍然相反。

如果你說些什麼,模塊的異常類是定義,而不是像你說的,它是從拋出,這當然是完全不同的事情:

try: 
    ...whatever... 
except Exception, e: 
    print "caught an exception defined in module", e.__class__.__module__ 

內置的異常實際上在模塊exceptions中定義,因爲此代碼也會告訴您。當然,一旦你有模塊名稱(這個代碼片段給你),你可以進一步探索,如果你願意,例如通過獲取模塊對象(僅通過模塊名稱索引sys.modules)等。

4

通常,我只是閱讀文檔。 Python模塊或函數的部分文檔是它定義的例外列表。如果它沒有列出任何內容,我只是假設我正在尋找Python內建異常。

順便說一句,StopIteration異常是任何Python「可迭代」對象的標準方式,表示您已到達將提供給您的數據的末尾。這個循環:

cursor.execute('SELECT * FROM pname') 
while 1: 
    try: 
     print(cursor.next()) 
    except StopIteration: 
     break 

可以寫爲:

cursor.execute('SELECT * FROM pname') 
for x in cursor: 
    print(x) 

編輯:我不得不說的是,儘管我的開朗自信的異常將被記錄在案,我找不到在Python這樣的列表docstring幫助或dbapi2的網頁幫助。在這種情況下,我想我只是做你做的事情:谷歌搜索異常的名稱,看看彈出了什麼!

1

一般我包裹的最低限度,我可以在一個try..except塊,例如:

try: 
    os.rename('foo', 'bar') 
except EnvironmentError: 
    ... 

try: 
    open('bar') 
except EnvironmentError: 
    ... 

這樣我可以適當地和單獨地處理每個異常。

1

異常是函數簽名的某種部分。第一件事是閱讀文檔,應該給出它可以拋出的異常列表。大多數模塊就是這種情況。

在您的代碼中,您應該捕獲最小的異常,並且只需在代碼的頂部(例如在main中)捕捉一個常規catch並在某處打印traceback以便知道未處理的異常來自何處。

然後正確的方法來確保您沒有錯過任何異常,爲您的代碼編寫單元測試並涵蓋每種可能的情況。

我希望它能幫助

1

你可以使用Python的inspect模塊和通用的異常處理,像這樣:

from inspect import getmodule 
try: 
    # attempt some task 
except Exception, e: 
    print getmodule(e) 

這會吐出像這樣的模塊和它的路徑:

<module 'some.module' from '/path/to/some/module.pyc'>