gpt4 book ai didi

python - 使用新类型重新抛出 Python 异常

转载 作者:行者123 更新时间:2023-11-28 21:54:54 25 4
gpt4 key购买 nike

我有一个打开 sqlite 文件的类 NameDatabase。几件事可能会出错,例如数据库格式错误、模式错误等。这通常会导致异常(在我的例子中是 sqlite3.Error)。

我不想让那个异常逃过我的课。相反,我想给调用我自己的异常类(推理:除了 NameDatabase 我还有图像和 GPS 轨迹的类,我想向来电者展示一个通用的要处理的异常列表)。

首先,这是个好主意吗?其次,我该怎么做才能最好?

我当前的代码:

class FileParseError(...): pass

class NameDatabase:
def __init__(self, fname):
self.fname = fname
try:
self.conn = sqlite3.connect(fname)
# Check if we can query the DB and if the schema is ok.
self.conn.execute('SELECT count(*) FROM names')
except sqlite3.Error:
raise FileParseError("Not a valid database: '%s'", fname)

这有效,但给出了双重回溯(在处理上述异常期间,发生了另一个异常)。我理想情况下拥有的是原始回溯,以及我自己的类型 FileParseError 的异常(它可以存储有关原始异常的一些信息)。

我知道我可以在我的代码中使用 sys.exc_info() 实现类似的功能异常处理程序并在外部重新引发异常,但这似乎凌乱,因为我必须在 except 子句中设置一个标志以记住处理之后出错。有没有更好的办法?

exc = None
try:
...
except sqlite3.Error:
exc = sys.exc_info()
if exc:
raise FileParseError("Invalid DB '%s': %s", fname, str(exc[1])), None, exc[2]

平台:Windows 上的 CPython 3.3。

类似问题:10555671正是我现在所拥有的。我正在寻找避免双重追溯的东西,同时也避免手动 exc 标志设置和 rechecking-after-except。

最佳答案

您似乎想将新异常与现有异常链接起来。这可以使用 PEP 3134 引入的语法来完成.或者,您可以使用 PEP 409 中添加的语法完全抑制先前的异常。 .

要链接异常,在 except 语句中用 as 给捕获的异常一个名称,然后在raise 语句结束。像这样:

except sqlite3.Error as e:
raise FileParseError("Not a valid database: '%s'", fname) from e

如果你想完全抑制 sqlite 错误,而不是仅仅将它转换为另一种异常类型,你可以在 raise 语句中使用 from None:

except sqlite3.Error:
raise FileParseError("Not a valid database: '%s'", fname) from None

当上下文被抑制时,内部异常仍然可用,但不会在回溯中打印出来。

如果您想更详细地了解异常链问题,您应该阅读上面链接的 PEP,或许还可以阅读 PEP 415其中描述了 PEP 409 的更新实现。

关于python - 使用新类型重新抛出 Python 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com