哪个更糟糕-代码重复或两次尝试/除外?

Glo*_*eye 2 python design-patterns

我遇到一种情况,我想在处理异常的同时执行多项操作。由于我想就一般情况进行讨论,因此我将把我的具体情况翻译成一些更一般的语言。

当这段代码中有异常时,我想:

  1. 始终执行回滚式操作
  2. 如果它是特定于应用程序的异常,我想执行一些日志记录并吞下该异常。

因此,我可以想到两种解决方法,两者都很丑陋:

# Method nested-try/except block
try:
    try:
        do_things()
    except:
        rollback()
        raise
except SpecificException as err:
    do_advanced_logging(err)
    return
Run Code Online (Sandbox Code Playgroud)
# Method Duplicate Code
try:
    do_things()
except SpecificException as err:
    rollback()
    do_advanced_logging(err)
    return
except:
    rollback()
    raise
Run Code Online (Sandbox Code Playgroud)

两者将具有相同的行为。

我自己倾向于嵌套的try / except解决方案。尽管速度可能会稍慢一些,但我认为速度差异在这里并不重要-至少与我的具体情况无关。我想避免重复代码,这也是因为我的rollback()语句比数据库回滚所涉及的稍微多一点,即使它具有完全相同的目的(它涉及Web-API)。

我没有发现有更好的第三种选择吗?还是重复代码方法更好?请注意,rollback()功能已被尽可能地排除,但仍包含一个函数调用和三个参数,其中包括一个硬编码的字符串。由于此字符串是唯一的,因此没有理由将其命名为常量。

sma*_*sey 7

如何检查代码中的异常实例类型?

# Method .. No Duplicate Code
try:
    do_things()
except Exception as e:
    rollback()
    if isinstance(e, SpecificException):
        do_advanced_logging(e)
        return
    raise
Run Code Online (Sandbox Code Playgroud)

  • @JaccovanDorp就是你。;) (2认同)
  • @JaccovanDorp`SpecificException除外,因为e`实际上也在做一些类型检查,你知道吗?-) (2认同)