python - 哪个更糟糕——重复代码或双重尝试/异常(exception)?

标签 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
# Method Duplicate Code
try:
    do_things()
except SpecificException as err:
    rollback()
    do_advanced_logging(err)
    return
except:
    rollback()
    raise

两者将具有相同的行为。

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

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

最佳答案

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

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

关于python - 哪个更糟糕——重复代码或双重尝试/异常(exception)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749531/

相关文章:

python - 获取列表中相邻元素的所有组合

c# - 如果一个对象解析它自己的输入,它是否被认为破坏了 SRP?

PHP:提供静态和非静态方法的类的设计模式

design-patterns - 使用MVVM时,是否应该创建新的 View 模型以不同方式显示同一模型?

c++ - 实时应用中图像采集和图像处理的设计模式或最佳实践

python - Numpy fill_diagonal 返回 None

python - MobileNet ValueError : Error when checking target: expected dense_1 to have 4 dimensions, 但获得形状为 (24, 2) 的数组

python - 我可以使用 ElementTree 获取 XML 文件的完整结构吗?

python - 使用 Python.Net 导入具有依赖项的 .NET Standard 2.0 类库

java - 我应该如何在 RxJava 中建模流程?