2016-01-05 6 views
0

У меня есть функция, которая читает CSV, проверяет значения в строках, и если все в порядке, они записывают строки в новый CSV-файл. У меня есть несколько функций проверки, которые я вызываю в своей основной функции, чтобы проверить значение и формат строк.Исключение исключения из вызываемой функции

Я пытаюсь реализовать свою основную функцию таким образом, чтобы, когда я вызываю другие функции проверки и что-то не проверяет, я пропустил запись этой строки целиком.

#main function 
for row in reader: 
    try: 
     row['amnt'] = divisible_by_5(row['amnt']) 
     row['issue_d'] = date_to_iso(row['issue_d']) 
     writer.writerow(row) 
    except: 
     continue 

#Validation function 
def divisible_by_5(value): 
    try: 
     float_value = float(value) 
     if float_value % 5 == 0 and float_value != 0: 
      return float_value 
     else: 
      raise ValueError 
    except ValueError: 
     return None 

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

Итак, как я могу обработать исключение (ValueError), поднятое в divisible_by_5 в моем цикле for, чтобы я не писал строки, которые вызывают исключение?

+0

Не могли бы вы рассказать о том, что именно вы ожидаете и что не работает? В чем вопрос? – karlson

ответ

3

Вы можете повторно вызвать исключение попавшего в обработчик исключений и иметь другой обработчик стек вызовов обрабатывать его с помощью пустогоraise заявления внутри в except блоке:

except ValueError: 
    raise # re raises the previous exception 

Таким образом, , внешний обработчик в «main» может поймать его и continue.

Примечание: Как есть, ваш пустой except: блок в петле for будет ловить все. Указание ожидаемого исключения (except ValueError в этом случае) обычно считается хорошей идеей.


Более просто, не положил тело вашей функции проверки divisible_by_5 в try заявлении. Python автоматически ищет ближайший за исключением блока, определенного и использует его, если текущее исключение соответствует указаны исключения:

def raiser(): 
    if False: 
     pass 
    else: 
     raise ValueError 

try: 
    raiser() 
except ValueError: 
    print "caught" 

Это будет печатать caught.

+1

Посмотрел на это. Я вижу, что я не добавлял 'valueError' в мою исключенную строку в моей основной функции. Разве это единственная разница? – Brosef

+1

Это и тот факт, что вы не воссоздаете исключение; вы возвращаете 'None' в' except' 'divisible_by_5'. Вы должны указать 'except ValueError' в своей основной строке и a) либо полностью удалить« try-except »в функции, либо b) просто заменить' return None' на 'raise' –

+2

Извините. просто увидели ваш обновленный ответ. Это сработало. Большое спасибо! – Brosef