我的代码会像这样绘制一个异常:
try:
causeEitherError1orError2
except Error1:
handle Error1
cause Error2
except Error2:
handle Error2
尝试操作A会导致Error1或Error2。处理Error1有时会导致Error2。当错误2可能由原始尝试或错误1引起时,如何处理Error1和Error2?
答案 0 :(得分:2)
我认为您的错误处理程序甚至不应该再次导致错误。这似乎是一个奇怪的设计。然而,你可以通过声明一个处理每个错误的函数并可能自己迭代地调用它来解决这个问题。但这会导致一个大问题:成像如果你正在调用你的函数,导致错误类型1,它被处理,并在此错误2被引发。处理此问题再次导致类型1错误,依此类推。你将得到一个堆栈溢出,因为没有结束。
您可以为函数的全局错误级别添加某种错误级别计数器,这会通过在错误处理程序中引发错误而增加。然后你可以添加某种限制,在此限制下将停止错误处理。
答案 1 :(得分:2)
一般来说,这似乎是一个复杂的设计,但你确实能够用一个except
大括号捕获多个异常。您还可以嵌套try-except
处理程序。一种可能的设计是:
try:
... # action A
except (Error1, Error2) as e:
try:
... # handle e
except Error2 as f:
... # handle f
如果您想要辨别第一次提出的Exception
,您可以随时查看类型:
print(type(e)) # prints Error1 or Error2 depending on what was raised
或者更准确地说,使用isinstance
支票缩小范围:
if isinstance(e, Error1):
... # handle e as Error1
else:
... # handle e as Error2
答案 2 :(得分:1)
如果try: .. except Error1:
的整个块都可以提升Error2
那么整个尝试除了应该在另一个尝试之外:
try:
try:
causeEitherError1orError2
except Error1:
handle Error1
cause Error2
except Error2:
handle Error2
这样可以提高和捕获两个错误。
答案 3 :(得分:-1)
这似乎是一种奇怪的情况,但我可以想象在处理网络请求时这样的事情是必要的。您可以尝试这样的结构:
try:
causeEitherError1orError2
except (Error1, Error2) as e:
try:
handle e
except Error2 as q:
handle q