在for循环python中捕获错误

时间:2015-05-29 05:29:18

标签: python python-2.7 avro

我在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

可能是因为该文件已损坏?

EDIT2: 根据通过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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

你需要在循环中使用try / except:

except UnicodeEncodeError:

顺便说一下,指定您尝试捕获的特定类型的错误(就像我对var locationArray = ["suburb1", "suburb2", "suburb3", "suburb4", "suburb5", "suburb6", "suburb7", "suburb8", "suburb9", "suburb10"]; $("#suburbSearch").focusout(function() { if($.inArray($("#suburbSearch").val(), locationArray) != -1) { if($("#suburbSearch").val() == "suburb1") $("#radSec").html(""); $("#radSec").append(enterSuburb1 + enterSuburb2 + enterSuburb3 + enterSuburb4 + enterSuburb5); } else alert("It's Not There"); }); 所做的那样,这是一种很好的做法,因为否则您可能会非常难以调试代码!

答案 2 :(得分:0)

除了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时,你除了任何东西(并且可能包含一个模糊的RuntimeError),你永远不会知道发生了什么。它有时很有用,但它很危险,通常也是一种不好的做法。