Всем привет.
Знаете, что мне понравилось в питоне, и что я не видел в других языках — это то его Exceptions. Кроме того, что вы можете узнать строчку кода, где он возник , так вы можете ещё получить весь стек вызова до этого эксепшена, в виде массива, и для каждого из вызовов получить массив всех локальных переменных в этом вызове. По сути, если сразу при ошибке вываливать всю эту инфу, то, как правило, рытца, и трейсить все переменные — просто нет необходимости.
И если б не джанга, то я бы так и не узнал о этой возможности. Во время ошибки она вываливает пользователю всю инфу, о которой я рассказывал, и даже немножечко больше. Ну если быть точным, то не «ошибки», а эксепшена, который «вырвался» из вьюхи о не отловился не в одном из мидлов. Т.е. Грубо говоря – после всех мидлов ексепшен ловит уже сама джанга.
Вот, а теперь по сути. Получить всю эту инфу можно с помощью sys.exc_info(). Про него я подробно рассказывать не буду, т.к. Лучше мана я все равно не расскажу. А сама джанга под это сделал отдельный класс, в конструктор которого и передаются все эти данные
-
from django.views.debug import ExceptionReporter
С помощью него — я и написал свой мидл, задача которого предельно проста. В случае возникновения ошибки в работе — он ее отлавливает, записывает все данные в базу, а пользователя просит дополнить описанием о том – в результате чего произошла ошибка, и оставить свои контактные данные. Реализуется предельно просто. Мы получаем всю инфу, пишим в базу, после этого, получаем некий айди, и редиректим уважаемого пользователя на страницу, где он может оставить описательную инфу со своей стороны.
Сразу скидываю текст мидла. Думаю в описании структуры базы — необходимости нет. Но на всякий случай, я приложил исходничек, на котором я тестил это.
-
import sys
-
from django.views.debug import ExceptionReporter
-
from django.http import HttpResponseRedirect
-
from models import ErrInfo,ErrStack
-
from django.conf import settings
-
class GetUserErrorInfo(object):
-
def process_exception(self, request, exception):
-
exR = ExceptionReporter(request,*sys.exc_info())
-
frames = exR.get_traceback_frames()
-
er_info = ErrInfo(etext=str(exception),etype=type(exception).__name__)
-
er_info.save()
-
for item in frames:
-
ErrStack(err=er_info,function=item['function'],vars=str(item['vars']),filename=item['filename'],context_line=item['context_line'],lineno=int(item['lineno'])).save()
-
return HttpResponseRedirect(settings.ERR_INFO_PREFIX+'?id='+str(er_info.id))
Основательно я его еще не юзал — это пока только самая первая пред альфа версия ![]()
dj_errinfotar
Ну и конечно же, жду ваших отзывов.

February 10th, 2011 at 8:04 pm
vyvoz stroitelnogo musora spb…
vyvoz musora…