在 Python 中重新引发相同错误的最佳实践
Best Practices for re-raising the same error in Python
我在调用堆栈中有几个函数,它们会在发生错误时在堆栈中重新引发相同的异常。我熟悉 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()。
这是因为重新提出错误是一种很好的做法,不仅为了保险,而且对于您和阅读您代码的其他人来说也是一种可读性 - 它使代码更清晰。
由于错误已经出现,因此没有太大的技术优势。
我在调用堆栈中有几个函数,它们会在发生错误时在堆栈中重新引发相同的异常。我熟悉 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()。
这是因为重新提出错误是一种很好的做法,不仅为了保险,而且对于您和阅读您代码的其他人来说也是一种可读性 - 它使代码更清晰。
由于错误已经出现,因此没有太大的技术优势。