python - 确定异常类型的最佳方法

标签 python try-except isinstance

我有一个异常实例,需要根据其类型执行代码。哪种方式更清楚 - 重新引发异常或 isinstance 检查?

重新加注:

try:
    raise exception
except OperationError as err:
    result = do_something1(err)
except (InvalidValue, InvalidContext) as err:
    result = do_something2(err)
except AnotherException as err:
    result = do_something3(err)
except:
    pass

实例检查:

if isinstance(exception, OperationError):
    result = do_something1(err)
elif isinstance(exception, (InvalidValue, InvalidContext)):
    result = do_something2(err)
elif isinstance(exception, AnotherException):
    result = do_something3(err)
PS。代码用于 django process_exception 中间件,因此当重新引发异常时,我应该为所有未知异常编写 except:pass

最佳答案

首先去掉 except: pass 子句 - 人们不应该永远默默地传递异常,特别是在裸露的 except 子句中(应该无论如何,永远不要使用裸露的 except 子句)。

话虽这么说,“最佳”方法实际上取决于具体的用例。在上面的示例中,您显然对不同的异常/异常集有不同的处理程序,因此显而易见的解决方案是第一个。有时,您确实有一些对所有或大多数处理程序通用的代码,以及一些特定于一个异常或异常子集的代码,那么您可能需要对特定部分使用 isinstance ,即:

try:
   something_that_may_fail()
except (SomeException, SomeOtherException, YetAnotherOne) as e:
   do_something_anyway(e)
   if isinstance(e, YetAnotherOne):
      do_something_specific_to(e)

现在,正如 mkrieger 所评论的,处理三个或更多异常可能是一种代码或设计味道 - try block 中的部分可能做了太多事情 - 但有时你又不这样做没有太多选择(调用可能以多种不同方式失败的内置或第三方函数......)。

关于python - 确定异常类型的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394032/

相关文章:

python - Django - 格式化日期以从表单更新模型对象

python - 是否有任何计算机语言知道检查不存在的变量和检查是否存在之间的区别?

python - 检测变量是否为 sympy 类型

python - 类实例未通过 isinstance 检查

python - 如何将base64编码的字符串上传到s3并在python中访问html文件中的url

python - 钻取条形图 Dash 绘图

python - 如何在Python中记录缩进错误?

Python:try/except 调用返回错误值,不需要调用 except 子句

python - Ctrl-C 结束我的脚本,但它没有被 KeyboardInterrupt 异常捕获

Python - isinstance(类信息,类信息)