如何确定特定异常类的模块定义

时间:2009-12-10 05:31:17

标签: python exception exception-handling module

注意:我编辑了我的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如何识别异常源(搜索文档 - 直到我发现 - 找到它是我目前的方法)。

[是的我知道在SO上有一个几乎相同的问题 - 但是对于C#而不是python,如果你阅读了作者的编辑版本,你会发现他有一个不同的问题。]

5 个答案:

答案 0 :(得分:5)

  

来自python核心模块的第二个[[抛出异常]]

错误:它是通过拨打cursor.next完全而被抛出的,就像第一个被拨打cursor.execute一样 - 很难说你为什么这么做这种反事实的断言,但与事实相反仍然存在。

如果您正在谈论,异常类定义的模块是什么,而不是像您所说的那样抛出,那就完全是当然不一样:

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

内置异常实际上在模块exceptions中定义,因为此代码也会告诉您。当然,一旦你有模块名称(这个片段给你),你可以进一步探索,如你所愿,例如,通过获取模块对象(仅按模块名称索引sys.modules)等等。

答案 1 :(得分: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的网页帮助中找到这样的列表。在这种情况下,我想我只是做你做的事情:谷歌搜索异常的名称,看看有什么突然出现!

答案 2 :(得分:1)

通常我在try..except块中包含最小值,例如:

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

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

这样我可以适当地单独处理每个异常。

答案 3 :(得分:1)

异常是函数签名的一部分。要做的第一件事是阅读文档,应该给出它可以抛出的异常列表。大多数模块就是这种情况。

在你的代码中,你应该捕获最小的异常,并在代码的顶部(例如在你的主要代码中)有一个常规catch,并在traceback的某处打印,以便知道未处理的异常来自哪里。

然后,确保您不会错过异常的正确方法是为您的代码编写单元测试并涵盖所有可能的场景。

我希望它有所帮助

答案 4 :(得分: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'>