2017-01-27 14 views
1

У меня проблема с использованием CherryPy, и все исследования пока не привели к работающему решению.Python 2. */Cherrypy - Исключить обработку как объект или строку и вывести на страницу ошибки

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

Для генерации страницы ошибок я в настоящее время с помощью:

_cp_config = {'error_page.500': '<path_to_html_file>'} 

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

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

Любые советы о том, как это сделать, будут полезны.

Большое спасибо.

С уважением, Тедди

+0

Можете ли вы разработать немного больше о том, почему «try-except» не является вариантом? Потому что он будет делать именно то, что вы просите, и может быть ограничение ваших ограничений. –

+0

Я не совсем знаком с CherryPy, но после обращения к сервису с помощью «raise cherrypy.HTTPRedirect ('') в настоящее время содержимое отображается службой и возвращается с использованием« return template.render () ». I не нашли способ попробовать, кроме этого способа связи, имея в виду, что при отправке визуализированного содержимого javascript продолжает общаться с другими службами back end. –

+1

Есть ли [этот ответ] (http://stackoverflow.com/a/20406691/5086961) решает вашу проблему? –

ответ

3

Параметры конфигурации для обработки ошибок может быть сконфигурирован для приема вызываемым со следующей подписью: (status, message='', traceback='', version='')

Вы можете определить:

def error_404(status, message='', traceback='', version=''): 
    # do something, like rendering a template or send an email 
    return "Not Found" # or return your rendered template 

def error_500(status, message='', traceback='', version=''): 
    # do something, like rendering a template or send an email 
    return "Error 500" # or return your rendered template 

_cp_config = { 
    'error_page.500': error_500, 
    'error_page.404': error_404 
} 
+0

Мне понравился этот метод - он идеально подходит, но как я могу отправить сообщение из исключения - например, если есть отключение базы данных? –

+1

Если трассировка не передается в качестве аргумента (config 'request.show_traceback' является' False'), вы можете получить трассировку с: 'import cherrypy._cperror as cperror', а затем получить последнюю трассировку с помощью' cperror.format_exc() '. Или, если вам нужна только функция, 'from cherrypy._cperror import format_exc'. Функция основана на [stdlib traceback module] (https://docs.python.org/3.6/library/traceback.html). – cyraxjoe

+1

Для _completeness_ вы можете переопределить все ответы об ошибках, настроив 'request.error_response', но вам придется выполнить некоторую дополнительную работу, функция не принимает никаких аргументов, я рекомендую вам вместо этого заменить« error_page.500 ». – cyraxjoe