在 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()。

这是因为重新提出错误是一种很好的做法,不仅为了保险,而且对于您和阅读您代码的其他人来说也是一种可读性 - 它使代码更清晰。

由于错误已经出现,因此没有太大的技术优势。