2012-05-15 2 views
7

Почему это плохая идея, чтобы поймать все исключения в Python?Плохая идея поймать все исключения в Python

Я понимаю, что ловить все исключения, используя пункт except: даже поймать «специальное» исключение Python: SystemExit, KeyboardInterrupt и GeneratorExit. Так почему бы просто не использовать предложение except Exception:, чтобы поймать все исключения?

+6

Должен поймать их всех – jamylak

+0

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

+4

@jamylak: HTTP: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –

ответ

20

Потому что это ужасно неспецифично, и это не позволяет вам делать что-либо интересное с исключением. Более того, если вы ловите каждое исключение, может быть множество исключений, которые происходят, которых вы даже не знаете, что происходит (что может привести к сбою вашего приложения, если вы действительно не знаете почему). Вы должны быть в состоянии предсказать (либо через документацию по чтению, либо экспериментировать), какие именно исключения вы должны обрабатывать и как их обрабатывать, но если вы слепо подавляете все из них с самого начала, вы никогда не узнаете.

Итак, по популярному запросу, вот пример. Программист пишет код Python, и она получает IOError. Вместо того, чтобы исследовать дальше, она решает поймать все исключения:

def foo(): 
    try: 
     f = open("file.txt") 
     lines = f.readlines() 
     return lines[0] 
    except: 
     return None 

Она не понимает этого вопроса в своих отношениях: что делать, если файл существует и доступен, но он пуст? Тогда этот код поднимет IndexError (так как список lines пуст). Поэтому она будет часами задаваться вопросом, почему она возвращает None из этой функции, когда файл существует и не заблокирован, не осознавая того, что было бы очевидно, если бы она была более конкретной в обнаружении ошибок, а именно, что она обращается к данным, которые могут не быть существовать.

+0

@ Raffe: Можете ли вы привести конкретные примеры, пожалуйста? – Bandicoot

+0

@Bandicoot конкретные примеры того, почему ловить все исключения - плохая идея? –

+0

@ Raffe: Yup. Помог бы мне лучше понять ваш ответ. Благодаря ! – Bandicoot

3

Потому что вы, вероятно, хотите обрабатывать каждое исключение по-разному. Это не то же самое, что иметь KeyInterrupt, чем иметь проблему кодирования или одну ОС ... Вы можете поймать определенные исключения один за другим.

try: 
    XXX 
except TYPE: 
    YYY 
except TYPE: 
    ZZZ 
Смежные вопросы