Python 其中";除「;在嵌套的“中具有优先级”;试一试;声明?
我在我的代码中有一个非常微妙的部分,我正试图优化它,我需要完美的错误处理。以下是我的功能的简化:Python 其中";除「;在嵌套的“中具有优先级”;试一试;声明?,python,exception,Python,Exception,我在我的代码中有一个非常微妙的部分,我正试图优化它,我需要完美的错误处理。以下是我的功能的简化: try: try: # Do something # Serial communication except Exception as e: # Do something break except Big_error: # Do something break 我知道这可能看起来很琐碎,但除了之外,哪
try:
try:
# Do something
# Serial communication
except Exception as e:
# Do something
break
except Big_error:
# Do something
break
我知道这可能看起来很琐碎,但除了之外,哪个有优先权?我的大错误
可以被异常捕获
,但我希望在最后一个异常捕获它
(这是一个很好的做法吗?目前,如果#串行通信
抛出一个大错误
,只有第一个会捕获错误,例外情况除外,如e
。如果从catch
块内部抛出Big\u error
(假设不是issubclass(Big\u error,KeyError)
),则将抛出第二个异常。您可以滥用此行为以如下方式重写代码:
try:
try:
# Serial Communication
except BigError:
raise
except Exception:
try:
# Error handling
except KeyError:
# KeyError handling
except BigError:
# BigError handling
在这里,raise
语句将确保异常永远不会到达泛型except。代码中的except
处理程序没有顺序或任何内容,因此“优先级”不适用
带有异常除外的块
看起来就像外部块的#do something
。要么提高,要么不提高。而且,目前,异常除外
将拦截大错误
并将其吞下,除非您重新引发。如果大错误
发生在串行通信
块中,则被异常除外作为e
捕获,因为它是基类(捕获异常
并不是一种好的做法,请始终尝试指定将要发生的异常)
如果您希望在最后一次捕获,请执行以下操作:
try:
# Do something
# Serial communication
except Big_error:
# Big_error handling
except KeyError:
# KeyError handling
except Exception: # try to avoid this one
# rest of errors
最里面的匹配except
具有优先级。如果您想将异常传递给下一个更高的except
只需在内部except
块中调用raise
而不带参数。谢谢!所以except大错误:
永远不会发生,也不会raise
引发所有捕获到的可能错误吗?仅此而已如果从Exception
重新调用,并且如果Big_error
是Exception
的子类,则如果在Exception块内引发,则会发生Big_error
。因此raise
将跳过Exception
?是的,每个异常处理程序仅适用于<代码>try
语句,而不是任何其他异常处理程序。请注意,相同的原则不适用于finally