【问题标题】:Handling external code exceptions in python在python中处理外部代码异常
【发布时间】:2014-08-04 10:31:06
【问题描述】:

我有:

  1. 调用外部供应商代码的函数call_vendor_code()
  2. 异常类MyDomainException(Exceprion)

我知道函数call_vendor_code() 可以抛出MyDomainException(因为函数中的逻辑是我的)。但是我如何知道子调用中call_vendor_code() 中可能会抛出哪些供应商代码异常?

例子:

def call_vendor_code():
    if not vendor.package.module.make_more_love():
        raise MyDomainException('Not enough love.')

供应商代码可能会引发我无法处理的任何其他异常。可以从供应商代码中拦截所有异常,但我认为这是不好的解决方案。

def call_vendor_code():
    try:
        if not vendor.package.module.make_more_love():
            raise MyDomainException('Not enough love.')
    except Exception, e:
        raise MyDomainException(e)

如何与其他级别的异常交互/不交互?

【问题讨论】:

  • 为什么这是一件坏事?为了确保包装所有异常,需要做一些事情。
  • @simeon-visser 例如,我们丢失了回溯。
  • 是的,但这是 Python 问题,而不是应用程序逻辑问题。包装异常仍然可以。 Python 3 在这方面做了改进:blog.ionelmc.ro/2014/08/03/…

标签: python exception exception-handling code-organization


【解决方案1】:

你的逻辑是正确的。

如何更优雅地处理这些供应商特定的异常取决于 关于供应商代码引发的异常类型。

它们是普通的 python 异常吗(例如 ValueError、TypeError 等)?然后 你没有太多选择。您应该将它们包装在一个泛型下 except Exception 声明。在这些不幸的情况下,许多人 尝试通过解析异常消息来区分错误类型。 一个主要的反模式,但你能做什么?

他们是否提出了自己的供应商特定例外情况(最佳情况)? 然后,您可以轻松区分并更优雅地处理它们 代码。他们应该有一些关于它的文档:) 或者,如果代码可用,请通读代码并亲自查看。

如果我们谈论的是与某些外部系统(某些 例如一种数据库),他们可能有一个通用的 VendorException 存储在异常中的一些内部错误代码(1133、623 等) 实例作为属性。同样,他们很可能会列出 这些错误代码,以及它们在某种文档中的描述, 您可以使用它们将它们映射到您自己的自定义异常中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多