【问题标题】:What's the proper way to reraise a custom exception?重新引发自定义异常的正确方法是什么?
【发布时间】:2018-08-14 15:16:38
【问题描述】:

如果我有这个功能,

def parse_datetime(s, **kwargs):
    """ Converts a time-string into a valid
    :py:class:`~datetime.datetime.DateTime` object.

        Args:
            s (str): string to be formatted.

        ``**kwargs`` is passed directly to :func:`.dateutil_parser`.

        Returns:
            :py:class:`~datetime.datetime.DateTime`
    """
    if not s:
        return None
    try:
        ret = dateutil_parser(s, **kwargs)
    except (OverflowError, TypeError, ValueError) as e:
        logger.exception(e, exc_info=True)
        raise SyncthingError(*e.args)
    return ret

将捕获的异常引发为公共库异常的最正确方法是什么? (SyncthingError(Exception)) 现在的写法不能正常工作

【问题讨论】:

  • 如果你想提高SyncthingError,那么就这样做:raise SyncthingError(e)。如果您想引发您捕获的异常,只需执行raise
  • 你能试试raise ... from ...吗?

标签: python python-3.x


【解决方案1】:

只要公共库异常的构造函数接受错误或异常,您就应该能够引发它。例如:

Class LibraryException(Exception)...
Class LibraryException(Error)...

【讨论】:

    【解决方案2】:

    在 Python 3 中,异常可以被链接,

    raise SyncthingError("parsing error") from e
    

    将生成一个包含原始异常详细信息的堆栈跟踪。

    raise statement 文档中有示例。

    【讨论】:

    • 是否有 Python2 后备方案?这非常优雅。
    • @blakev 有一个来自six 的兼容性层实现,在 Python 2 中这并没有做太多,但它阻止了SyntaxError。还有 reraise() 函数值得研究。
    • @blakev 我已经从版本 3 开始学习 Python。我不得不搜索并发现:stackoverflow.com/questions/1350671/… 与您的问题非常相似。
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2010-09-10
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多