2016-08-10 4 views
0

Я Python обучаемость, пытаясь справиться несколько сценариев:Как обрабатывать несколько исключений?

  1. Чтение файла.
  2. Форматирование данных.
  3. Манипулирование/копирование данных.
  4. Запись файла.

До сих пор у меня есть:

try: 
    # Do all 
except Exception as err1: 
    print err1 
    #File Reading error/ File Not Present 

except Exception as err2: 
    print err2 
    # Data Format is incorrect 
except Exception as err3: 
    print err3 
    # Copying Issue 
except Exception as err4: 
    print err4 
    # Permission denied for writing 

Идея реализации таким образом, чтобы поймать точную ошибку для всех различных сценариев. Я могу сделать это во всех отдельных блоках try/except.

Возможно ли это? И разумно?

+0

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

+0

Я беру это обратно, основываясь на вашем сценарии, вам намного лучше создавать несколько блоков catch catch. то есть 'def check_file (file): try ... except your_ exceptions_here ...' – Eduard

+0

В основном основная идея блока catch try состоит в том, чтобы что-то делать, а не делать все, поскольку на этом пути можно встретить несколько ошибок. – Eduard

ответ

3
  1. Ваши try блоки должны быть как можно меньше, так

    try: 
        # do all 
    except Exception: 
        pass 
    

    не то, что вы хотите сделать.

  2. Код в вашем примере не будет работать так, как вы ожидаете, потому что в каждом блоке except вы поймаете наиболее общий тип исключения Exception. Фактически, только первый блок except будет выполнен.

То, что вы хотите делать это, имеющих несколько try/except блоков, каждый из которых отвечает за, как несколько вещей, как это возможно, и поймать наиболее конкретное исключение.

Например:

try: 
    # opening the file 
except FileNotFoundException: 
    print('File does not exist') 
    exit() 

try: 
    # writing to file 
except PermissionError: 
    print('You do not have permission to write to this file') 
    exit() 

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

try: 
    ssh.connect() 
except (ConnectionRefused, TimeoutError): 
    pass 

или

try: 
    ssh.connect() 
except ConnectionRefused: 
    pass 
except TimeoutError: 
    pass 
+0

Итак, вы предлагаете мне пойти с несколькими блоками try/catch? – User

+0

@User действительно ... – DeepSpace

+0

Играя адвоката дьявола: разве мы не сделали прыжок от явной обработки ошибок до исключений, которые пузыряют стек * специально *, чтобы получить возможность создавать большие блоки try и централизовать обработку ошибок в другом месте ? – Kos

0

Да, это возможно.

Просто скажите, как, например:

try: 
    ... 
except RuntimeError: 
    print err1 
except NameError: 
    print err2 

... 

Просто определить точную ошибку вы хотите перехватить.

0

Как DeepSpace заявил,

Ваши try блоки должны быть как можно меньше.

Если вы хотите достичь

try: 
    # do all 
except Exception: 
    pass 

Тогда вы могли бы также сделать что-то вроде

def open_file(file): 
    retval = False 
    try: 
     # opening the file succesful? 
     retval = True 
    except FileNotFoundException: 
     print('File does not exist') 
    except PermissionError: 
     print('You have no permission.') 
    return retval 

def crunch_file(file): 
    retval = False 
    try: 
     # conversion or whatever logical operation with your file? 
     retval = True 
    except ValueError: 
     print('Probably wrong data type?') 
    return retval 

if __name__ == "__main__": 
    if open_file(file1): 
     open(file1) 
    if open_file(file2) and crunch_file(file2): 
     print('opened and crunched') 
Смежные вопросы