Имеет ли смысл обработчик исключений для всего приложения?

StackOverflow https://stackoverflow.com/questions/95642

  •  01-07-2019
  •  | 
  •  

Вопрос

Короче говоря, у меня есть основательное приложение на Python, которое, помимо прочего, выполняет вызовы "losetup", "mount" и т.д.в Linux.Существенно потребляет системные ресурсы, которые должны быть освобождены по завершении.

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

Имеет ли смысл делать что-то вроде следующего?

def main():
    # TODO: main application entry point
    pass

def cleanup():
    # TODO: release system resources here
    pass

if __name__ == "__main__":
    try:
        main()
    except:
        cleanup()
        raise

Это что-то, что обычно делается?Есть ли способ получше?Возможно, деструктор в одноэлементном классе?

Это было полезно?

Решение

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

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

Просто будьте осторожны, чтобы ваш обработчик верхнего уровня не создавал исключений!

Другие советы

Деструктор (как в методе __del__) - плохая идея, поскольку их вызов не гарантируется.Модуль atexit является более безопасным подходом, хотя он все равно не сработает, если произойдет сбой интерпретатора Python (а не приложения Python), или если используется os._exit(), или процесс будет агрессивно остановлен, или машина перезагрузится.(Конечно, последний пункт в вашем случае не является проблемой.) Если ваш процесс подвержен сбоям (например, он использует непостоянные модули расширения сторонних производителей), вы можете выполнить очистку в простом родительском процессе для большей изоляции.

Если вы действительно не беспокоитесь, используйте модуль atexit.

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

если вы используете классы, вы, конечно, должны освободить ресурсы, которые они выделяют в своих деструкторах.Используйте опцию try (попробовать):для всего приложения, только если вы хотите освободить ресурсы, которые еще не освобождены деструкторами ваших классов.

И вместо того, чтобы использовать все, кроме:, вы должны использовать следующий блок:

try:
    main()
finally:
    cleanup()

Это обеспечит очистку более питоническим способом.

Это кажется разумным подходом, более простым и надежным, чем деструктор в одноэлементном классе.Вы также могли бы взглянуть на "атексит" модуль.(Произносится "на выходе", а не "a tex it" или что-то в этом роде.Меня это долгое время смущало.)

Подумайте о написании контекстного менеджера и использовании инструкции with .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top