dou*_*oug 2 python exception-handling module exception
注意:我编辑了我的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"))
Run Code Online (Sandbox Code Playgroud)
#
cursor.execute('SELECT * FROM pname')
while 1:
try:
print(cursor.next())
except StopIteration:
break
Run Code Online (Sandbox Code Playgroud)
#
我让两个片段错误出来以查看抛出的异常,然后对try/finally块进行编码 - 但这并没有告诉我有关定义异常类的模块的任何信息.在我的例子中,只有一个导入的模块,但是还有更多,我有兴趣知道一个经验丰富的pythonista如何识别异常源(搜索文档 - 直到我发现 - 找到 - 它是我目前的方法).
[是的,我知道在SO上有一个几乎相同的问题 - 但是对于C#而不是python,如果你阅读了作者的编辑版本,你会发现他有一个不同的问题.]
来自python核心模块的第二个[[抛出异常]]
错误:它是从调用抛出cursor.next,正是像第一个被从调用抛出cursor.execute-这很难说,为什么你主张坦率这个反事实,但事实相反但它仍然存在.
如果你正在谈论,定义了一个异常类的模块,而不是像你说的那样,抛出它的地方,当然这是完全不同的事情:
try:
...whatever...
except Exception, e:
print "caught an exception defined in module", e.__class__.__module__
Run Code Online (Sandbox Code Playgroud)
内置异常实际上是在模块中定义的exceptions,因为此代码也会告诉您.当然,一旦你有了模块名称(这个片段给你),如果你愿意,你可以进一步探索,例如通过获取模块对象(只是sys.modules按模块名称索引)等.