【发布时间】:2021-08-01 19:55:48
【问题描述】:
我在调用堆栈中有一些函数,它们会在发生错误时重新在堆栈中向上引发相同的异常。我熟悉 Python 习语,即 try/except 块中的独立 raise 将重新引发正在处理的相同异常,但如果调用不在 try/except 块中,仍会引发异常。
假设异常在调用堆栈中的更高层处理,inbounds1() 或 inbounds2() 是否会被视为“更好”的做法,或者两者都不是?
import numpy as np
class ArrayShapeError(Exception):
...
def get_distance(points):
if points.ndim != 2 or points.shape[1] != 3:
raise ArrayShapeError("Parameter 'points' is not of shape (n, 3)")
return np.linalg.norm(points, axis=1)
# Implicit try/except
def inbounds1(points):
return get_distance(points) < 1
# Explicitly try/except and re-raise
def inbounds2(points):
try:
return get_distance(points) < 1
except ArrayShapeError:
raise
if __name__ == "__main__":
# Ok
print(inbounds1(np.random.rand(5, 3)))
print(inbounds2(np.random.rand(5, 3)))
# Raises ArrayShapeError
print(inbounds1(np.random.rand(5, 2)))
print(inbounds2(np.random.rand(5, 2)))
【问题讨论】:
-
在
inbounds2中,您想通过捕获您不打算处理的异常来完成什么? -
您最终希望在哪里处理异常?这个问题似乎基于边缘观点。
-
@paisanco 我应该澄清一下异常在调用堆栈中的更高处理。立即修复