【问题标题】:Catch error in a for loop python在for循环python中捕获错误
【发布时间】:2015-05-29 05:29:18
【问题描述】:

我在 avro 数据读取器对象上有一个 for 循环

for i in reader:
    print i

然后我在 for 语句中遇到 unicode 解码错误,所以我想忽略该特定记录。所以我这样做了

try:
    for i in reader:
        print i
except:
    pass

但它不会继续下去。我该如何克服这个问题

编辑:添加了错误跟踪

    Traceback (most recent call last):
  File "modify.py", line 22, in <module>
    for record in reader:
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/datafile.py", line 362, in next
    datum = self.datum_reader.read(self.datum_decoder) 
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 445, in read
    return self.read_data(self.writers_schema, self.readers_schema, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 490, in read_data
    return self.read_record(writers_schema, readers_schema, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 690, in read_record
    field_val = self.read_data(field.type, readers_field.type, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 468, in read_data
    return decoder.read_utf8()
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 233, in read_utf8
    return unicode(self.read_bytes(), "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb4 in position 14: invalid start byte

可能是因为文件损坏了?

编辑2: 根据通过 iterobject 的答案中的建议,我修改了代码并得到了这个错误

    Traceback (most recent call last):
  File "modify.py", line 28, in <module>
    print next(iterobject)["filepath"]
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/datafile.py", line 362, in next
    datum = self.datum_reader.read(self.datum_decoder) 
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 445, in read
    return self.read_data(self.writers_schema, self.readers_schema, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 490, in read_data
    return self.read_record(writers_schema, readers_schema, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 690, in read_record
    field_val = self.read_data(field.type, readers_field.type, decoder)
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 468, in read_data
    return decoder.read_utf8()
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 233, in read_utf8
    return unicode(self.read_bytes(), "utf-8")
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 226, in read_bytes
    return self.read(self.read_long())
  File "/usr/lib/python2.6/site-packages/avro-1.7.7-py2.6.egg/avro/io.py", line 184, in read_long
    b = ord(self.read(1))
TypeError: ord() expected a character, but string of length 0 found

【问题讨论】:

  • 能否也包括异常的回溯。也请修正你的代码 sn-p 的缩进。
  • 能否请您发布您在阅读器中的价值。

标签: python python-2.7 avro


【解决方案1】:

如果您的错误出现在 for i in 中。然后试试这个,如果出现UnicodeDecodeError,它将跳过迭代器中的元素。

iterobject = iter(reader)
while iterobject:
    try:
        print(next(iterobject))
    except StopIteration:
        break
    except UnicodeDecodeError:
        pass

【讨论】:

    【解决方案2】:

    你需要循环内的 try/except :

        for i in reader:
           try: 
               print i
           except UnicodeEncodeError:
               pass
    

    顺便说一句,最好指定您尝试捕获的特定类型的错误(就像我对except UnicodeEncodeError: 所做的那样,否则您可能会使您的代码难以调试!

    【讨论】:

    • @iLoveCamelCase 在这种情况下,avro 阅读器中存在错误,除非您想破解该错误(修复错误),否则您在脚本中几乎无能为力。
    • 我在想是否 avro 文件已损坏
    【解决方案3】:

    您可以排除specific error,避免未知错误被忽视。

    Python 3.x:

    try:
        for i in reader:
            print i
    except UnicodeDecodeError as ue:
        print(str(ue))
    

    Python 2.x:

    try:
        for i in reader:
            print i
    except UnicodeDecodeError, ue:
        print(str(ue))
    

    通过打印错误可以知道发生了什么。当你只使用 except 时,你除了 anything (这可能包括一个不起眼的 RuntimeError),你永远不会知道发生了什么。它有时很有用,但很危险,通常是不好的做法。

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 2019-09-08
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2017-08-13
      • 2018-08-04
      • 1970-01-01
      • 2015-05-31
      相关资源
      最近更新 更多