2013-04-11 48 views
9

Sentry może wykryć dodatkowe dane skojarzone z wyjątkiem takich jak:Jak podnieść wyjątek Pythona i dołączyć dodatkowe dane dla Sentry?

enter image description here

Jak podnieść taki wyjątek od Python (jest to aplikacja Django) z własnymi additional data pól ?.

+0

'raise' bierze żadnej klasy lub instancji. Czy możesz być jaśniejszy o to, o co prosisz? –

+0

Jakie dodatkowe dane chcesz dodać? – mgilson

+0

offtopic - ale skąd pochodzi zrzut ekranu? dlaczego nie mam tak ładnych wyjątków w django? - edytuj: przepraszam, to jest sentry. – user1688936

Odpowiedz

9

I wyjątków przy użyciu biblioteki logging zalogować więc po debugowanie kodu trochę zauważyłem parametr extra:

import logging 
logger = logging.getLogger('my_app_name') 

def do_something(): 

    try: 
     #do some stuff here that might break 

    except Exception, e: 
     logger.error(e, exc_info=1, extra={'extra-data': 'blah', }) 

Passing exc_info = 1 jest taka sama jak wywołanie logger.exception. Jednak exception() nie przyjmuje kwargs, które są wymagane do korzystania z parametru extra.

Te wartości pojawią się w sekcji "Dane dodatkowe" na pulpicie błędu Sentry.

+0

To jest to. Jeśli używasz klienta Raven, możesz: ["przekazać go jako dane w dodatkowej klauzuli"] (http://raven.readthedocs.org/en/latest/config/logging.html) 'eg: logger.error ("Wystąpił jakiś szalony błąd", exc_info = True, extra = {'data': {'username': request.user.username}}) ' – AJP

+1

To tak naprawdę nie odpowiada na pytanie. 'logger.error (...)' nie spowoduje ponownego podniesienia wyjątku, więc po prostu go połknie i będzie kontynuował. W jaki sposób zgłosisz wyjątek z dodatkowymi danymi? – dAnjou

1

Można spróbować jednego z tych dwóch podejść:

>>> # Raise the exception with the data you want. 
>>> raise Exception('extra information') 
Traceback (most recent call last): 
    File "<pyshell#64>", line 1, in <module> 
    raise Exception('extra information') 
Exception: extra information 
>>> # Catch an exception and add extra arguments. 
>>> try: 
    raise Exception() 
except Exception as error: 
    error.args += ('extra information',) 
    raise 

Traceback (most recent call last): 
    File "<pyshell#68>", line 2, in <module> 
    raise Exception() 
Exception: extra information 
>>> 

Można dodać dowolną liczbę dodatkowych pól danych, jak chcesz, dodając więcej argumentów.

1

Sentry handler dodaje, że informacje w zrzucie ekranu podczas przechwytywania wiadomości za wyjątek i bierze te informacje z traceback, a nie sam wyjątków.

Możesz dodać dodatkowe pola, przekazując dodatkowe argumenty słów kluczowych do .capture(); Django client zrobi to za Ciebie, jeśli przejdziesz na przykład do obiektu request.

Obecnie żadne inne dane nie pochodzą z wyjątków. Trzeba samemu rozszerzyć obsługę wyjątków, aby dodać taki obiekt.

1

wes' answer mi nie pomoże, ponieważ chcę, aby rzeczywiście podbicie wyjątek nie tylko zalogować go.

Oto co zrobiłem (client jest klient Raven Sentry):

client.extra_context({'foo': 'bar'}) 
raise RuntimeError('Whoops, something went wrong!') 
0

Żadna z istniejących odpowiedzi służył mój dokładny przypadek użycia dobrze (co było dodać dodatkowy kontekst z obiektu django Request do wartownika dane). Co skończyło się na tym, że bardzo dobrze działało, po tym, jak niektóre kopanie zastąpiło klienta przy użyciu SENTRY_CLIENT setting.

Oto pełna prosty przypadek użycia:

from raven.contrib.django.raven_compat import DjangoClient 

class CustomSentryClient(DjangoClient): 

    def get_data_from_request(self, request): 
     result = super(EToolsSentryClient, self).get_data_from_request(request) 
     if getattr(request, 'custom_field', None): 
      if 'extra' not in result: 
       result['extra'] = {} 
      result['extra']['custom_field'] = request.custom_field 
     return result 

a następnie w settings.py byłoby po prostu dodać

SENTRY_CLIENT = 'myapp.CustomSentryClient'