Обработка несмертельных исключений в пилонах - PullRequest
1 голос
/ 22 января 2011

В моем приложении Pylons я хотел бы иметь возможность генерировать исключения в любом месте кода и перехватывать нефатальные исключения в центральной точке, чтобы я мог вернуть «дружественную» страницу с ошибкой, такую ​​как «Извините,Я не могу этого сделать ".
Вместо этого фатальные исключения должны идти в обработчик ошибок по умолчанию, который отправляет мне сообщение об ошибке по электронной почте и возвращает пользователю стандартную" внутреннюю ошибку сервера ".
Прямо сейчас я 'Я использую что-то вроде этого в BaseController.__call__:

try:
    return WSGIController.__call__(self, environ, start_response)
except Exception, exc:
    if self.is_nonfatal_exception(exc):
        start_response("200 OK", [("Content-type", "text/plain")])
        return ["Sorry!"]
    raise

, но рекомендуется ли это?

1 Ответ

3 голосов
/ 04 февраля 2011

Да, это выглядит хорошо.

Также взгляните на pylons.controllers.utils.abort () . В любом месте кода вашего контроллера вы можете сделать abort(some_http_code[, message]). Типичные HTTP-коды, которые будут использоваться с этим, будут 404 («Страница не найдена», клиент ищет что-то, чего там нет), 403 («Запрещено», пользователю не разрешен доступ к этой странице / ресурсу), 400 («Плохо» запрос ", проверка параметров запроса не удалась) и другие. Эта функция также работает, генерируя специальные исключения, затем перехватывая их и возвращая стандартные страницы ошибок где-то из стека промежуточного программного обеспечения. Конечно, вы также можете позвонить abort() из моделей и других мест, а не только из контроллеров. Но это будет плохой стиль, смешивать логику контроллера с логикой модели, прыгать по уровням абстракций.

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

...