在其消费者中处理生成器异常

2024-02-12

这是后续处理生成器中抛出的异常 https://stackoverflow.com/q/11366064/989121并讨论一个更普遍的问题。

我有一个读取不同格式数据的函数。所有格式都是面向行或记录的,并且对于每种格式都有一个专用的解析函数,作为生成器实现。因此,主读取函数获取一个输入和一个生成器,生成器从输入中读取其各自的格式并将记录传递回主函数:

def read(stream, parsefunc):
    for record in parsefunc(stream):
        do_stuff(record)

where parsefunc是这样的:

def parsefunc(stream):
    while not eof(stream):
        rec = read_record(stream)
        do some stuff
        yield rec

我面临的问题是parsefunc可能会抛出异常(例如,从流中读取时),但它不知道如何处理它。负责处理异常的函数是mainread功能。请注意,异常是在每条记录的基础上发生的,因此即使一条记录失败,生成器也应该继续其工作并返回记录,直到整个流耗尽。

在上一个问题中我试图提出next(parsefunc) in a try阻止,但事实证明,这是行不通的。所以我必须添加try-except to the parsefunc本身,然后以某种方式向消费者传递异常:

def parsefunc(stream):
    while not eof(stream):
        try:
            rec = read_record()
            yield rec
        except Exception as e:
            ?????

我很不愿意这样做,因为

  • 使用没有意义try在不打算处理任何异常的函数中
  • 我不清楚如何将异常传递给消费函数
  • 将会有很多格式和很多parsefunc的,我不想用太多的帮助代码让它们变得混乱。

有没有人建议更好的架构?

给谷歌用户的提示:除了最上面的答案之外,还要注意森德勒斯 https://stackoverflow.com/a/11419139/989121 and Jon's https://stackoverflow.com/a/12655987/989121帖子 - 非常聪明和有洞察力的东西。


您可以在 parsefunc 中返回记录和异常的元组,并让消费者函数决定如何处理异常:

import random

def get_record(line):
  num = random.randint(0, 3)
  if num == 3:
    raise Exception("3 means danger")
  return line


def parsefunc(stream):
  for line in stream:
    try:
      rec = get_record(line)
    except Exception as e:
      yield (None, e)
    else:
      yield (rec, None)

if __name__ == '__main__':
  with open('temp.txt') as f:
    for rec, e in parsefunc(f):
      if e:
        print "Got an exception %s" % e
      else:
        print "Got a record %s" % rec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在其消费者中处理生成器异常 的相关文章

随机推荐

  • 将所有“/”替换为 File.separator

    在Java中 当我这样做时 a b c d replaceAll 我回来了 a b c d 但是当我这样做时 a b c d replaceAll File separator 它抛出 StringIndexOutOfBoundsExcep
  • 从 mongodb 中删除重复的数组值

    在 mongodb 中 我有一个集合 其中数组具有重复的条目 例如 id ObjectId 57cf3cdd5f20a3b0ba009777 Chat 6 string 1348157031 Riyadh 548275320 Mohamma
  • 如何禁用 jqueryui datepicker 中的 Enter 键

    我正在使用 jQueryUI 日期选择器 当用户单击文本框并按 Enter 键时 将填充当前日期 我想避免这种情况 我已经尝试过这个 datepicker on keypress function e if e which 13 e pre
  • 有没有用Python编写的好的构建框架?

    我从 NAnt 切换到使用 Python 来编写构建自动化脚本 我很好奇是否有任何值得使用的构建框架类似于 Make Ant 和 NAnt 但它们是基于 Python 的 例如 Ruby 有 Rake 那么Python呢 Try SCons
  • 设备旋转时丢失“MediaPlayer”(及其他变量)

    我正在为 Android 创建一个音乐播放器 它基本上可以工作 问题是 当我水平转动设备时 我会丢失 Activity 中的所有变量 这是有道理的 因为它被销毁并重新创建 我尝试使用捆绑包通过 onSaveInstanceState 和 o
  • 在调用另一个 JSON 之前删除 Leaflet 地图中的所有数据/标记

    我正在检索不同的数据以使用不同的 JSON 文件标记传单地图 每个单选按钮都会检索不同的 JSON 文件 但是 当我选择不同的单选按钮时 我无法清除标记 所有标记只是从一个 JSON 文件添加到另一个 JSON 文件 当我选择不同的单选按钮
  • 无需事务日志即可恢复 SQL Server 数据库

    Given a SQL Server 2008 bak文件 有办法恢复吗仅数据文件来自 bak file 没有事务日志 我问的原因是该数据库的事务日志文件大小很大 超出了我可用的磁盘空间 我对交易日志不感兴趣 对任何未完成的交易也不感兴趣
  • 有 YAML 数据库吗?

    我非常喜欢 YAML 的数据模型 它保留了 JSON 的大部分简单性 并通过一些有时很重要的功能 例如自定义数据类型和引用 对其进行了扩展 那么有没有什么方法可以在 YAML 数据模型 或非常类似的东西 中存储大量数据并使用索引对其进行查询
  • D3:如何处理单个图表中的缩放和工具提示?

    我有一个可视化 本质上是一系列堆叠的条形图 每个条形图包含多个面板 例如 here https i stack imgur com IAX6o png是三个这样的条形图 每个都有四个面板 我已经成功实现了跨图表协调的平移 缩放功能 This
  • 获取 jinja2 模板中列表的长度

    如何获取 jinja2 模板中列表中的元素数量 例如 在Python中 print template render products 在jinja2中 span You have what goes here products span s
  • Django 可以在每个单元测试之间刷新其数据库吗?

    Django 1 2 beta 将在每个运行的测试之间重置数据库 这意味着每个测试都在空数据库上运行 然而 数据库并不flushed 刷新数据库的影响之一是auto increment计数器被重置 考虑一个通过主键从数据库中提取数据的测试
  • numpy.argmin 用于大于阈值的元素

    我感兴趣的是获取满足特定条件 在我的例子中为中等阈值 的一维 NumPy 数组中最小值的位置 例如 import numpy as np limit 3 a np array 1 2 4 5 2 5 3 6 7 9 10 我想有效地屏蔽所有
  • SQL Server 2005 和 SQL Server 2012 中选择查询的默认排序顺序

    SQL Server 2005 和 SQL Server 2012 中选择查询的默认排序顺序有区别吗 我有一个没有主键的表变量 当我在 SQL Server 2005 中对表变量执行选择查询时 将选择记录并根据其中一列按字母顺序显示 在 S
  • 如何将粘性 div 保持在固定标题下方

    我在我的项目中使用 Bootstrap 4 并且在固定导航栏下保留带有 sticky top 类的 div 似乎遇到问题 我尝试过使用 javascript 来替换滚动上的 css 但这似乎不起作用 我知道有一种方法可以为导航栏设置一个 i
  • 合并两个数据帧以按顺序获取每个数据帧的交替行

    我的数据框DATA is k l g 1 A 2004 12 2 B 2004 3 4 3 C 2004 4 5 另一个数据框DATA2 is i d t 1 A 2012 22 2 B 2012 4 8 3 C 2012 5 6 我想要得
  • 学习 UIScrollView 的基础知识

    我一直很难找到 UIScrollView 的好例子 即使是苹果的 UIScrollView Suite 我也觉得有点缺乏 我正在寻找一个教程或示例集 向我展示如何创建类似于 iPhone Safari 选项卡滚动的内容 当您从一个浏览器窗口
  • 相同域,不同文件夹 PHP 会话

    我想根据用户所在的文件夹设置不同的会话 ID 例如 我有域名https example com https example com其中有文件夹 app1 app2 等 每个应用程序文件夹内有多个文件 我想设置一个会话 ID 用于 app1
  • 找不到“算法”文件

    我正在尝试使用以下库在 Xcode 中创建一个简单的控制台应用程序 https github com marstone ingress ios tree master s2 geometry https github com marston
  • 使用格式规范迷你语言截断和填充

    我目前正在编写使用 Python 的代码 用空格填充字符串格式规范迷你语言 http docs python org 2 library string html formatspec print user lt 10 you re welc
  • 在其消费者中处理生成器异常

    这是后续处理生成器中抛出的异常 https stackoverflow com q 11366064 989121并讨论一个更普遍的问题 我有一个读取不同格式数据的函数 所有格式都是面向行或记录的 并且对于每种格式都有一个专用的解析函数 作