【问题标题】:catch specific error message in Python在 Python 中捕获特定的错误消息
【发布时间】:2017-07-04 16:03:53
【问题描述】:

当我的一个依赖项抛出特定的 ValueError 时,我需要捕获并以某种方式处理它,否则会重新引发错误。 我没有发现任何最近的问题以符合 Python 3 的方式处理此问题,并且处理的情况是唯一区分返回的错误是字符串消息。

这篇文章可能是最接近的:Python: Catching specific exception

像这样的东西——catch specific HTTP error in python——不会起作用,因为我没有使用像 HTTP 错误那样提供特定代码的依赖项。

这是我的尝试:

try:
    spect, freq_bins, time_bins = spect_maker.make(syl_audio,
                                                   self.sampFreq)
except ValueError as err:
    if str(err) == 'window is longer than input signal':
        warnings.warn('Segment {0} in {1} with label {2} '
                      'not long enough for window function'
                      ' set with current spect_params.\n'
                      'spect will be set to nan.')
        spect, freq_bins, time_bins = (np.nan,
                                       np.nan,
                                       np.nan)
    else:
        raise

如果重要的话,依赖关系是 scipy,当频谱图因特定原因失败时我需要捕获(我正在获取频谱图的段比窗口函数短)。

我意识到我的方法很脆弱,因为它依赖于错误字符串不变,但错误字符串是唯一将它与同一函数返回的其他 ValueErrors 区分开来的东西。所以我计划进行单元测试来保护自己免受这种情况的影响。

【问题讨论】:

  • 这种方法有什么问题?也许我错过了,但我不确定你在问什么。
  • 更好的方法是在较低级别捕获 ValueError 以引发自定义异常。 spect_maker.make 是你代码的一个方法吗?
  • @Stael 我在问“这种方法有什么问题”,因为我找不到任何特定的 SO 问题、随机博客文章、Python 文档中的部分等,即使我感觉这将是一个普遍的问题。也许我没有使用正确的搜索字词
  • @AdrienMatissart 是的 spect_maker.make 是我的代码的一种方法。我想过提出一个自定义异常。在那种情况下,我会在这里捕获那个自定义异常,对吧?不知道其他好处是什么。自定义异常本身仍然很脆弱,但我想会有关注点分离? IE。在当前方法中,我不会有一个长而难以阅读的 try-catch + if 语句列表
  • 理想情况下,如果您可以限制可能引发此特定错误的块,则无需检查错误字符串。但是我们需要更多关于这个方法的详细信息。

标签: python python-3.x error-handling scipy try-except


【解决方案1】:

好吧,所以根据其他人的cmets,我猜应该是这样的:

# lower-level module
class CustomError(Exception):
    pass

# in method
Class Thing:
    def __init__(prop1):
        self.prop1 = prop1

    def method(self,element):
        try:
            dependency.function(element,self.prop1)
        except ValueError as err:
            if str(err) == 'specific ValueError':
                raise CustomError
            else:
                raise # re-raise ValueError because string not recognized

# back in higher-level module
thing = lowerlevelmodule.Thing(prop1)
for element in list_of_stuff:
    try:
        output = thing.method(element)
    except CustomError:
        output = None
        warnings.warn('set output to None for {} because CustomError'.
                       format(element))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2019-02-20
    • 2010-12-05
    • 1970-01-01
    • 2016-03-25
    • 2011-03-12
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多