Выйти изящно, если файл не существует

У меня есть следующий script в Python 3.2.3:

try:
    file = open('file.txt', 'r')
except IOError:
    print('There was an error opening the file!')
    sys.exit()

#more code that is relevant only if the file exists

Как я могу выйти изящно, если файл не существует (или просто ошибка его открытия)?

Я могу использовать exit(), но это открывает диалоговую панель с вопросом, хочу ли я убить приложение.

Я могу использовать sys.exit(), но это вызывает исключение SystemExit, которое не выглядит великолепно на выходе. Я получаю

Traceback (most recent call last):   
File "file", line 19, in <module>
    sys.exit() SystemExit

Я могу использовать os.exit(), но это убивает Python на уровне C, без каких-либо очищений, которые я мог бы выполнять.

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

Я просто хочу напечатать "Ошибка..." и выйти. Я работаю в IDLE.

Ответы

Ответ 1

Это очень изящный способ сделать это. Трассировка SystemExit не будет напечатана вне IDLE. При желании вы можете использовать sys.exit(1), чтобы указать оболочке, что script завершен с ошибкой.

В качестве альтернативы вы можете сделать это в своей "основной" функции и использовать return для завершения приложения:

def main():
    try:
        file = open('file.txt', 'r')
    except IOError:
        print('There was an error opening the file!')
        return

    # More code...

if __name__ == '__main__':
    main()

Здесь основной код выполнения приложения инкапсулируется в одну функцию, называемую "main", а затем выполняется , только если script выполняется непосредственно интерпретатором Python, или, другими словами, если script он не импортируется другим script. (Для переменной __name__ установлено значение "__main__", если script выполняется непосредственно из командной строки. В противном случае оно будет установлено на имя модуля.)

Преимущество состоит в том, чтобы собрать всю логику выполнения script в одну функцию, сделав ваш очиститель script и вы сможете полностью выйти из script с помощью инструкции return, как и на большинстве компилируемых языков.

Ответ 2

Использование sys.exit() в порядке. Если вы заинтересованы в выходе, вы всегда можете добавить дополнительный блок try/except в разделе обработки ошибок, чтобы поймать SystemExit и остановить его от перенаправления на вывод консоли.

try:
    file = open('file.txt', 'r')
except IOError:
    try:
        print('There was an error opening the file!')
        sys.exit()
    except SystemExit:
        #some code here that won't impact on anything