2013-06-07 2 views
1

Я открываю файлы в нескольких функций, и, кажется, немного грязный/лишне держать «изящно» обработки потенциальных IOErrors:Python: Необходимо уловить открытые() исключения?

try: 
    fileHandle = open(file, 'r') 
except: 
    print "Error: failed to open file %s" % (file) 
    sys.exit(2) 

В каком контексте является приемлемым только:

fileHandle = open(file, 'r') 

и ожидать, что пользователь будет отслеживать сообщения трассировки в случае исключения?

+8

Вы должны действительно использовать «с» при работе с файлами. http://effbot.org/zone/python-with-statement.htm – mishik

+4

Это зависит от того, для кого предназначена ваша программа. Вы хотите, чтобы ваши пользователи видели сообщения об ошибках? Вы на 95% уверены, что программа будет работать должным образом? Будут ли несколько раз это не оправдывать работу, которую вы вкладываете в нее? Тебе решать. – korylprince

+0

'с' требованиями: Python2.5 'от __future__ import with_statement', или неявно в Python2.6 +. (..и компания, я использую Python2.4) –

ответ

2

Это принцип исключений, реализованные в Python и других языках. Обработка исключений в необязательном порядке local функции, которая вызывает исключение.

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

http://docs.python.org/2/tutorial/errors.html#handling-exceptions


Если вы поймать исключение только для того, чтобы войти, вы можете вновь поднять его:

try: 
    fileHandle = open(file, 'r') 
except IOError: 
    print "Error: failed to open file %s" % (file,) 
    raise 

http://docs.python.org/2/tutorial/errors.html#raising-exceptions

1

Оберните свое приложение во внешнюю попытку/за исключением того, что печатает что-то немного приятнее и записывает детали gory. Я не сделал установку регистратор, но вы получите дрейф:

import os 
import sys 
import logging 
import traceback 

try: 
    my_application(params) 
except (OSError, IOError), e: 
    message = "%s - %s." % (e.filename, e.sterror) 
    sys.stderr.write("Error: %s. See log file for details%s" % (message, os.linesep)) 
    logger.error('myapp', message) 
    for line in traceback.format_exc().split(os.linesep): 
     logger.warn('myapp', line) 
    sys.exit(2) 
1

Используйте ' с ключевым словом.

with open(file, 'r') as fileHandle: 
    do_whatever() 

Этот код является более или менее эквивалентно

try: 
    fileHandle = open(file, 'r') 
except IOError: 
    pass 
else: 
    do_whatever() 
finally: 
    fileHandle.close() 

В основном, это гарантирует, что вы открыты и правильно закрыть файлы, и перехватывает исключения.

+0

Ответьте на второй пример, если 'file' не удалось открыть, не будет ли' fileHandle' быть неопределенным, что вызовет проблемы в блоке 'finally:'? –

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