Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 其中";除「;在嵌套的“中具有优先级”;试一试;声明?_Python_Exception - Fatal编程技术网

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