【问题标题】:Is there a use case for an alternative "exception cause" in Python?Python中是否有替代“异常原因”的用例?
【发布时间】:2020-08-07 18:52:51
【问题描述】:

背景

在 Python 中,如果您引发异常 from None,则可以抑制 Exception 的上下文。 PEP 409 描述了其背后的基本原理。有时您只想显示一个有意义的(自定义)异常。使用 PEP 415 时,实现会随着以下参数发生变化:

这个方案 [来自 PEP 409] 的主要问题是它使 __cause__ 的角色复杂化。 __cause__ 应该指出异常的原因,而不是是否应该打印 __context__。 __cause__ 的这种用法在未来也不容易扩展。例如,有一天我们可能希望允许程序员选择将打印 __context__ 和 __cause__ 中的哪一个。

问题

PEP 419 讨论了未来的用例。现在是否有任何有效的用例(Python 3.3+)可以使用替代异常原因?例如,考虑以下代码:

    class CustomError(BaseException):
        pass

    class StupidError(BaseException):
        def __init__(self, message='This is just a stupid error.'):
            super(StupidError, self).__init__(message)
            self.message = message

    try:
        value = int('a')
    except Exception:
        raise CustomError('Custom error message') from StupidError

输出:

StupidError: This is just a stupid error.

The above exception was the direct cause of the following exception:

Traceback (most recent call last): (...)
CustomError: Custom error message

是否存在您想要隐藏ValueError 但显示StupidError 的实际用例?我的意思是您可以在StupidError 中提供一些相关信息,而这些信息仅在ValueError 中不存在?也许我只是在想这整件事。

【问题讨论】:

  • 作为一个非常小众的例子。在我的上一家公司,我们有一个错误会导致相同的最终结果,但可能是由几件事引起的。所以就最终用户而言,我们会有一个统一的结局,但就内部实践/日志记录而言,我们会做不同的事情。我们使用 other_error 的错误来处理它。我敢肯定这不是最好的例子,但我在生产中实际看到的唯一一个。

标签: python python-3.x exception


【解决方案1】:

当然。假设您正在编写一个网络应用程序并且需要对用户隐藏敏感/复杂的数据。

假设用户尝试请求,但网络应用后端无法从 MySQL 数据库中读取必要的数据(无论出于何种原因)。我不想让 MySQL 模块引发错误,这可能会暴露有关应用程序内部工作方式的敏感信息,或者只是简单地混淆用户,我想捕获它然后抛出我的自定义异常(我们称之为serverError)。该自定义异常将向用户显示 HTTP 500 页面并在内部报告错误,以便开发人员对其进行分析以找出问题所在以及如何预防。

这意味着我只需要编写一次通用错误处理代码,然后当我发现错误时,我可以引发serverError,它会为我处理错误报告。

【讨论】:

  • 感谢您的回答。我知道提出自定义异常很有帮助。我也了解从 None 引发自定义 ServerError 的用例。但是为什么你会在你的用例中从另一个异常中引发 ServerError 呢?或者你会从 ServerError 中引发?
  • 当捕获到我在编程中没有考虑到的通用异常(异常为 e 除外)时,或者当一个罕见但可能的特定异常(如 SQL 读取)时,我会引发 ServerError错误)。这意味着 Web 应用程序将正常失败,并且 ServerError 异常类可以处理报告。
猜你喜欢
  • 2012-03-04
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
相关资源
最近更新 更多