在Python中处理外部代码异常

2 投票
1 回答
1733 浏览
提问于 2025-04-18 15:54

我有:

  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)

我该如何处理或不处理其他层级的异常呢?

1 个回答

2

你的逻辑是正确的。

如何更优雅地处理这些特定于供应商的异常,主要取决于供应商代码抛出的异常类型。

它们是普通的Python异常(比如ValueError、TypeError等)吗?如果是这样,你的选择不多。你应该把它们放在一个通用的except Exception语句里。在这种不太理想的情况下,很多人会尝试通过解析异常信息来区分错误类型。这是一种常见的反模式,但你也无能为力。

如果它们抛出的是自己特定的异常(这是最理想的情况)呢?那么你就可以更轻松地在代码中区分和处理这些异常。它们应该有一些相关的文档说明 :) 或者,如果代码是公开的,可以自己看看代码。

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

撰写回答