Python 如何确定在其中定义特定异常类的模块

Python 如何确定在其中定义特定异常类的模块,python,exception,exception-handling,module,Python,Exception,Exception Handling,Module,注意:我编辑了我的Q(在标题中),以便更好地反映我真正想知道的。在最初的标题和我的Q的文本中,我提到了抛出异常的来源;我的意思是,我应该提到的,正如下面一个高度紧张但很有帮助的回答所指出的,是异常类在中定义的模块。这可以从以下事实中得到证明:正如原始Q的答案下面的一个答案所指出的,异常分别是从对cursor.execute和cursor.next的调用中抛出的——当然,这不是编写try/except块所需的信息 例如(Q与SQLite或PySQLite模块没有具体关系): # # 我让这两个代码

注意:我编辑了我的Q(在标题中),以便更好地反映我真正想知道的。在最初的标题和我的Q的文本中,我提到了抛出异常的来源;我的意思是,我应该提到的,正如下面一个高度紧张但很有帮助的回答所指出的,是异常类在中定义的模块。这可以从以下事实中得到证明:正如原始Q的答案下面的一个答案所指出的,异常分别是从对cursor.execute和cursor.next的调用中抛出的——当然,这不是编写try/except块所需的信息

例如(Q与SQLite或PySQLite模块没有具体关系):

# # 我让这两个代码段都出错,以查看抛出的异常,然后对try/finally块进行编码——但这并没有告诉我定义了异常类的模块。在我的示例中,只有一个导入的模块,但在有更多模块的地方,我很想知道有经验的pythonista如何识别异常源(search-the-docs-till-i-occurrent-to-find-it是我当前的方法)


[是的,我知道在这方面有一个几乎相同的问题——但对于C#而不是python,而且如果你阅读作者的编辑版本,你会发现他脑子里有一个不同的问题。]

通常,我只是阅读文档。Python模块或函数的部分文档是它定义的异常列表。如果它没有列出任何内容,我就假设我正在寻找Python内置异常

顺便说一句,StopIteration异常是任何Python“iterable”对象发出信号表示您已经完成了它将提供给您的数据的标准方式。此循环:

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)

编辑:我不得不说,尽管我很高兴地相信异常会被记录下来,但我在PythonDocstring帮助或dbapi2的网页帮助中找不到这样的列表。在这种情况下,我想我只是做了你做的:谷歌搜索例外的名称,看看会弹出什么

通常,我会在一次尝试中包装我能包装的最小值。除了块,例如:

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

try:
    open('bar')
except EnvironmentError:
    ...
通过这种方式,我可以分别适当地处理每个异常

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

False:它是在调用
游标时抛出的。下一个
与调用
游标时抛出的第一个完全相同。执行
——很难说为什么你会直截了当地断言这个反事实,但与事实相反,它仍然存在

如果你说的是,异常类是在哪个模块中定义的,与你所说的从哪个模块抛出的,这当然是完全不同的:

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

内置异常实际上是在模块
异常中定义的,这段代码也会告诉您。当然,一旦你有了模块名(这段代码给了你),你可以进一步探索,如果你愿意的话,例如通过获取模块对象(只需按模块名索引
sys.modules
),等等。

异常某种程度上是函数签名的一部分。首先要做的是阅读文档,应该给出它可以抛出的异常列表。大多数模块都是这样

在您的代码中,您应该捕获最小的异常,并在代码的顶部(例如在主代码中)有一个常规捕获,然后在某个地方打印回溯,以便知道未处理的异常来自何处

然后,确保没有遗漏异常的正确方法是为代码编写单元测试,并涵盖所有可能的场景


我希望它有帮助

您可以使用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'>

from inspect import getmodule
try:
    # attempt some task
except Exception, e:
    print getmodule(e)
<module 'some.module' from '/path/to/some/module.pyc'>