【问题标题】:Python : Handling an error by provoking it. Is this good practice?Python:通过引发错误来处理错误。这是好习惯吗?
【发布时间】:2021-02-18 10:24:29
【问题描述】:

我有一个 Python 应用程序,我有一个记录器。

在执行的不同步骤中,应用程序必须读取各种输入文件。输入文件可以有不同的信息,但都是通过同一个函数读取的。

我正在查看的特定信息之一是名为 computation_id 的信息,并且必须存在于其中一个文件中,但可以不存在于所有其他文件中。

我很想知道处理这种情况的正确方法是什么。目前我正在这样处理它:

def input_reading(filename):
   results = {}
   [...]
   
   try:
     results['computation_id'] = read_computation_id()
   except KeyError:
     pass   
   [...]

   return results

因此,如果正在读取的文件中没有computation_id,代码将继续运行。但是,在某些时候,我需要这个计算 ID,因此我需要检查它是否从我希望找到它的文件中正确读取。

我实际上需要这个值在代码的后面。但是运行代码到此为止(这需要一些时间)然后失败是浪费计算时间。所以我的想法是尽快检查这个值并通过以下方式处理错误:

def specifc_file_read(filename):
   [...]

   results = input_reading('my_file')
   try:
     results['computation_id']
   except KeyError:
     logger.exception('no computation id provided, aborting')
     raise SystemExit('no computation id provided, aborting')

   [...]

这是好的做法吗?

我有一种感觉,因为我需要编写特殊的代码行来“尽快”检查代码中的错误,以避免浪费计算时间。

由于我在错误处理方面没有太多经验,因此我想知道这是否是一种好习惯,以免养成不良习惯。

【问题讨论】:

  • 您是否同时读取所有文件?还是按需处理?
  • 我按需处理它们
  • 我会说有一个带有文件 ID 和布尔值(例如 has_computation_id)的表是有意义的。或者某种缓存。
  • 我会检查密钥在使用它的函数中是否可用,如果没有,则抛出异常。
  • 代码的架构方式,我不能那样做。事实上,有些文件没有那个密钥,这应该不是问题。

标签: python logging error-handling


【解决方案1】:

这取决于你喜欢什么,imo。 我认为这将更具可读性

if 'computation_id' not in results: raise ...

虽然如果你想在开始一些繁重的数据处理之前检查它是否在任何文件中可用,你可以

for f in get_files():
    if 'computation_id' in f:
        break
else:
    raise SystemExit

因此,如果它没有中断,那么它将引发SystemExit,因此如果它至少在一个文件中不可用。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2011-06-01
    • 2023-03-11
    • 2015-03-03
    • 2016-06-27
    相关资源
    最近更新 更多