2016-03-26 2 views
-3

У меня есть программа, которая вызывает файл строк и выводит любые ошибки в stderr. Так что, если я получаю вход, который выглядит следующим образом:Python - ошибки при печати

line 1 2x 3 4 
line 1 2 x3 4 
lixe 251 2 3 4 5 
line 1 2 3 4 
line 251 2 3 4 

Тогда результат должен выглядеть следующим образом:

Error in line 1: 
    line 1 2x 3 4 
     ^
Error in line 2: 
    line 1 2 x3 4 
      ^
Error in line 3: 
    lixe 251 2 3 4 5 
    ^
Error in line 5: 
    line 251 2 3 4 
     ^
Error in line 6: 
    line 1 2 3 4 5 
       ^

Так вот что я для проверки ошибок:

except Exception as e: 
    for line in lines_file: 
     print >> sys.stderr, 'Error in line ' + str(line_number) + ":" 
     print >> sys.stderr, " " * 4 + line, 
     print >> sys.stderr, " " * (offset + 4) + "^" 
sys.exit(1) 

Но для этого код выглядит следующим образом:

Error in line 1: 
    line 1 2 x3 4 
      ^
Error in line 1: 
    lixe 251 2 3 4 5 
      ^
Error in line 1: 
    line 1 2 3 4 
      ^
Error in line 1: 
    line 251 2 3 4 
      ^
Error in line 1: 
    line 1 2 3 4 5 
      ^
Error in line 1: 
    line 1 2 3 4 x5 
      ^

И это только показывает одну строку. Итак, как я могу распечатать все строки? Вот мой код с Ьгу Бок:

for line in lines_file: 
    line_number = 1 
    #get offset up to start of coordinates 
    start = re.compile('\s*line\s*') 
    m = start.match(line) 
    offset = m.end() 

    try: 
     for i in range(4): 
      xy = re.compile('\s*([-]?[0-9]{1,3})\s*') 

      if xy.match(line,offset): 
       m = xy.match(line,offset) 
      else: 
       raise Exception 

      coordinate = m.group(1) 

      if int(coordinate) > 250 or int(coordinate) < -250: 
       raise Exception 

      offset = m.end() 

     end = re.compile('\s*$') 
     if not end.match(line,offset): 
      raise Exception 

    except Exception as e: 
     for line in lines_file: 
      print >> sys.stderr, 'Error in line ' + str(line_number) + ":" 
      print >> sys.stderr, " " * 4 + line, 
      print >> sys.stderr, " " * (offset + 4) + "^" 
    sys.exit(1) 

    line_number += 1 
    offset = 0 

    p = re.compile('line\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})') 
    m = p.match(line) 
    x0 = int(m.group(1)) 
    y0 = int(m.group(2)) 
    x1 = int(m.group(3)) 
    y1 = int(m.group(4)) 

    print str(x0), str(y0), str(x1), str(y1) 
+0

вам нужно написать цикл для печати всего – ABC

+0

какой вид петли. Это для каждого цикла, где вы идете «для x в строке»? – Chase

+0

Хорошо, я обновил свой код, чтобы показать больше своей программы. – Chase

ответ

0

Не уверен, если это решает проблему, но две вещи выскочить, если смотреть на свой код ...

(1) except блок в не изрезана блок try.

(2) Как следствие, переменные line_number и offset никогда не обновляются.

Если поместить except блок на уровне try, то код под except будет выполняться каждый раз, когда вы найдете исключение, и вам не нужно будет добавить второй for line ... цикл внутри него.

+0

На самом деле это было правильно отступом с блоком try, но я думаю, что он автоматически отформатировался, когда я вставлял код здесь. – Chase

+0

Я вижу --- спасибо за его исправление. Один вопрос: зачем вам нужно перебирать строки, когда вы видите исключение? После того, как он был пойман, он должен просто напечатать эту строку ... –

Смежные вопросы