Демоны Python - структура программы и контроль исключений - PullRequest
2 голосов
/ 07 марта 2012

Я давно занимаюсь любительским кодированием на Python и чувствую себя довольно комфортно с ним.Недавно, хотя я писал свой первый Daemon и пытаюсь понять, как должны работать мои программы.

В моих прошлых программах исключения можно было обработать, просто отменив программу, возможно, после небольшой очисткивверх.Единственное соображение, которое я должен был уделить структуре программы, - это эффективная обработка ввода без исключений.В сущности, «Мусор вошел, ничего не вышел».

В моем демоне есть внешний цикл, который фактически никогда не заканчивается, и оператор сна внутри него для управления интервалом, в котором происходят события.Обработка допустимых входных данных проста, но я изо всех сил пытаюсь понять, как лучше справляться с исключениями.Иногда исключение может происходить на нескольких уровнях вложенных функций, и каждому необходимо что-то вернуть своему родителю, который, в свою очередь, должен вернуть что-то своему родителю, пока управление не вернется к самому внешнему циклу.Каждая функция должна быть способна обрабатывать любое исключительное состояние не только для себя, но и для всех своих подчиненных.

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

Стив

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

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

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

0 голосов
/ 08 марта 2012

Ответ будет "это зависит".

Если в какой-либо низкоуровневой функции возникает исключение, может быть целесообразно перехватить его там, если на этом уровне достаточно информации для успешного завершения функции, несмотря на исключение. Например. при чтении треугольников из файла .stl нормальный вектор треугольника ему и явно задан, и неявно задан последовательностью трех точек, составляющих треугольник. Таким образом, если вектор нормали задан как (0,0,0), который является вектором длины 0 и должен вызвать исключение в конструкторе класса векторов Normal, это можно безопасно перехватить в конструкторе класса Triangle, потому что он все еще может быть рассчитан другими способами.

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

...