Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 12Dec

    Всем привет.

    Знаете, что мне понравилось в питоне, и что я не видел в других языках — это то его Exceptions. Кроме того, что вы можете узнать строчку кода, где он возник , так вы можете ещё получить весь стек вызова до этого эксепшена, в виде массива, и для каждого из вызовов получить массив всех локальных переменных в этом вызове. По сути, если сразу при ошибке вываливать всю эту инфу, то, как правило, рытца, и трейсить все переменные — просто нет необходимости.

    И если б не джанга, то я бы так и не узнал о этой возможности. Во время ошибки она вываливает пользователю всю инфу, о которой я рассказывал, и даже немножечко больше. Ну если быть точным, то не «ошибки», а эксепшена, который «вырвался» из вьюхи о не отловился не в одном из мидлов. Т.е. Грубо говоря – после всех мидлов ексепшен ловит уже сама джанга.

    Вот, а теперь по сути. Получить всю эту инфу можно с помощью sys.exc_info(). Про него я подробно рассказывать не буду, т.к. Лучше мана я все равно не расскажу. А сама джанга под это сделал отдельный класс, в конструктор которого и передаются все эти данные

    1. from django.views.debug import ExceptionReporter

    С помощью него — я и написал свой мидл, задача которого предельно проста. В случае возникновения ошибки в работе — он ее отлавливает, записывает все данные в базу, а пользователя просит дополнить описанием о том – в результате чего произошла ошибка, и оставить свои контактные данные. Реализуется предельно просто. Мы получаем всю инфу, пишим в базу, после этого, получаем некий айди, и редиректим уважаемого пользователя на страницу, где он может оставить описательную инфу со своей стороны.

    Сразу скидываю текст мидла. Думаю в описании структуры базы — необходимости нет. Но на всякий случай, я приложил исходничек, на котором я тестил это.

    1. import sys
    2. from django.views.debug import ExceptionReporter
    3. from django.http import HttpResponseRedirect
    4. from models import ErrInfo,ErrStack
    5. from django.conf import settings
    6. class GetUserErrorInfo(object):
    7.     def process_exception(self, request, exception):
    8.         exR = ExceptionReporter(request,*sys.exc_info())
    9.         frames = exR.get_traceback_frames()
    10.         er_info = ErrInfo(etext=str(exception),etype=type(exception).__name__)
    11.         er_info.save()
    12.         for item in frames:
    13.             ErrStack(err=er_info,function=item['function'],vars=str(item['vars']),filename=item['filename'],context_line=item['context_line'],lineno=int(item['lineno'])).save()
    14.         return HttpResponseRedirect(settings.ERR_INFO_PREFIX+'?id='+str(er_info.id))

    Основательно я его еще не юзал — это пока только самая первая пред альфа версия :)
    dj_errinfotar

    Ну и конечно же, жду ваших отзывов.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Posted by Oduvan @ 11:49 pm

    Tags: , , , , ,

blog comments powered by Disqus