Python:ODBC异常处理

0 投票
1 回答
1696 浏览
提问于 2025-04-15 11:28

我需要在我的应用程序中判断一个表格是否不存在或者表格里没有数据,这样我才能采取相应的措施。我可以把这两种错误分开处理吗?

>>>cursor.execute("delete from TABLE")

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
dbi.internal-error: [IBM][CLI Driver][DB2] SQL0100W  No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.  SQLSTATE=02000
 in EXEC

或者

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
dbi.program-error: [IBM][CLI Driver][DB2] SQL0204N  "SK77531.TCS_EXCEPTIONS" is an undefined name.  SQLSTATE=42704
 in EXEC

1 个回答

1

来自Python文档的内容:

一个try语句可以有多个except子句,用来处理不同的异常情况。

举个例子:

try:
    do_something_crazy
except AttributeError:
    print 'there was an AttributeError'
except NameError:
    print 'there was a NameError'
except:
print 'something else failed miserably'

最后一个except就像是一个“万用”捕捉器,只有在发生的异常不是AttributeError或NameError时才会执行。在实际的代码中,最好避免使用这种“万用”except子句,因为通常你希望在遇到意外错误时,代码能够失败并提醒你。

在你的具体情况下,你需要从dbi模块中导入可能会抛出的不同异常,这样你就可以在不同的except子句中进行检查。

所以可以像这样:

# No idea if this is the right import, but they should be somewhere in that module
import dbi

try:
    cursor.execute("delete from TABLE")
except dbi.internal-error:
    print 'internal-error'
except dbi.program-error:
    print 'program-error'

正如你在上面的文档页面中看到的,你可以选择在每个except子句中添加额外的属性。这样做可以让你访问实际的错误对象,这在某些时候可能是必要的,尤其是当你需要区分同一类的两个不同异常时。即使你不需要那么细致的区分,做一些额外的检查也是个好主意,以确保你处理的确实是你认为的那个错误。

说了这么多关于try/except的内容,我真正建议的是,在你尝试与数据库表交互之前,先查找一下你所使用的数据库库代码中是否有方法可以检查表是否存在。结构化的try/except在处理需要检查和清理的外部输入时非常有用,但在数据库表可能存在的情况下进行防御性编码,听起来可能会在后面给你带来麻烦。

撰写回答