【问题标题】:Best Practices for re-raising the same error in Python [closed]在 Python 中重新引发相同错误的最佳实践 [关闭]
【发布时间】: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 我应该澄清一下异常在调用堆栈中的更高处理。立即修复

标签: python exception


【解决方案1】:

我会使用 inbounds2()。

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

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

【讨论】:

  • 好旧的 PEP 20 再次罢工......“显式优于隐式。”具有讽刺意味的是,我在代码库中采用的方法是走隐含的“清洁”路线。是时候重构了!
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2020-12-24
  • 2011-02-12
相关资源
最近更新 更多