2009-12-10 56 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'>