Выйти изящно, если файл не существует
У меня есть следующий 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