2008-10-03 14 views
6

Piszę małą aplikację do debugowania dla zestawu, który opracowujemy i chciałbym go udostępnić kilku użytkownikom, aby sprawdzić, czy mogą one wywołać jakiekolwiek awarie. Czy ktoś zna sposób efektywnego owijania aplikacji wxPython, aby wykryć wszystkie nieobsługiwane wyjątki, które spowodowały awarię aplikacji?Jak mogę uchwycić wszystkie wyjątki z aplikacji wxPython?

Idealnie chciałbym uchwycić wszystkie dane wyjściowe (nie tylko błędy) i zalogować go do pliku. Wszelkie nieobsługiwane wyjątki powinny logować się do bieżącego pliku, a następnie zezwalać na wyjątek, tak jak zwykle (tj. Proces rejestrowania powinien być przezroczysty).

Jestem pewna, że ​​ktoś wcześniej musiał coś z tym zrobić, ale nie udało mi się znaleźć niczego, co wyglądałoby na przydatne w Google.

Odpowiedz

6

Dla zalogowaniu standardowe wyjście, można użyć opakowanie standardowe wyjście, takie jak ten:

from __future__ import with_statement 

class OutWrapper(object): 
    def __init__(self, realOutput, logFileName): 
     self._realOutput = realOutput 
     self._logFileName = logFileName 

    def _log(self, text): 
     with open(self._logFileName, 'a') as logFile: 
      logFile.write(text) 

    def write(self, text): 
     self._log(text) 
     self._realOutput.write(text) 

Następnie trzeba zainicjować go w głównym pliku Pythona (ten, który działa wszystko):

import sys  
sys.stdout = OutWrapper(sys.stdout, r'c:\temp\log.txt') 

Jeśli chodzi o rejestrowanie wyjątków, najprościej jest opakować metodę MainLoop metody wx.App w try..except, a następnie wyodrębnić informacje o wyjątku, zapisać je w pewien sposób, a następnie ponownie podnieść wyjątek przez raise, np .:

try: 
    app.MainLoop() 
except: 
    exc_info = sys.exc_info() 
    saveExcInfo(exc_info) # this method you have to write yourself 
    raise 
+0

Pozdrawiam Dzinx - Skończyło się na połączeniu Twojej sugestii i monopokalipsy –

+3

Próbowałem zrobić to w mojej aplikacji, aby wychwycić wyjątki i wyświetlić przyjazne okna dialogowe błędów, ale to nie zadziałało. Wydaje się, że ponieważ wxPython spawns inny wątek dla App.MainLoop(), że wyjątki są poza zakresem bloku try/except w tym punkcie. – Soviut

1

Istnieje wiele sposobów. Możesz umieścić blok try..catch w wxApplication :: OnInit, który nie zawsze działałby z Gtk.

miłą alternatywą byłoby zastąpić aplikację :: handleEvent w swoim wxApplication pochodzi klasy i napisać kod tak:

void Application::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& event) const 
{ 
    try 
    { 
     wxAppConsole::HandleEvent(handler, func, event); 
    } 
    catch (const std::exception& e) 
    { 
     wxMessageBox(std2wx(e.what()), _("Unhandled Error"), 
      wxOK | wxICON_ERROR, wxGetTopLevelParent(wxGetActiveWindow())); 
    } 
} 

Jest to C++ przykład, ale można z pewnością tłumaczyć do Python łatwo.

9

Do obsługi wyjątków, zakładając, że plik dziennika jest otwierany jako log:

import sys 
import traceback 

def excepthook(type, value, tb): 
    message = 'Uncaught exception:\n' 
    message += ''.join(traceback.format_exception(type, value, tb)) 
    log.write(message) 

sys.excepthook = excepthook 
+0

Pozdrawiam, monopokalipsa - skończyło się na połączeniu twojej sugestii i Dzinxa. Żałuję tylko, że nie mogę zaakceptować obu twoich odpowiedzi! –

3

Można wykorzystać

sys.excepthook

(patrz Python docs)

i przypisz do niego jakiś niestandardowy obiekt, który przechwyci wszystkie wyjątki, które nie zostały przechwycone wcześniej w kodzie. Możesz następnie zarejestrować dowolną wiadomość do dowolnego pliku, wraz z funkcją traceback i zrobić cokolwiek chcesz z wyjątkiem (przeinstaluj ją, wyświetl komunikat o błędzie i pozwól użytkownikowi kontynuować korzystanie z aplikacji itp.).

Jeśli chodzi o rejestrowanie stdout - najlepszym sposobem było dla mnie napisanie czegoś podobnego do OutWrappera DzinX.

Jeśli jesteś na etapie debugowania, rozważ spłukiwanie plików dziennika po każdym wpisie. Wpływa to bardzo negatywnie na wydajność, ale jeśli uda ci się spowodować uszkodzenie w jakimś ukrytym kodzie, twoje dzienniki nie wprowadzą cię w błąd.

Powiązane problemy