Wpis z mikrobloga

Mirki pytonowe, jak w unittestach sprawdzić czy logger pythonowy zwrócił błąd?

Załóżmy, że mam funkcję która przyjmuje dane i w sytuacji gdy są poprawne coś tam wykonuje a gdy są błędne to robi logger.error('error nr1234'). Teraz chcę napisać test który prześle błędne dane do funkcji i sprawdzi czy został wyrzucony błąd przez loggera. jak to sprawdzić? ( ͡° ʖ̯ ͡°)

#python #programowanie
  • 21
@Szarlejowiec: bzdura to ciebie wiesz. @Teal_c dobrze napisał. Jeżeli pojawi się błąd to aplikacja/wątek obsługujący usera powinien jak umrzeć i przekazać sterowanie do części odpowiedzialnej za ładne poinformowanie usera o problemie - niezależnej od części która się właśnie wywaliła. Absolutnie nie powinien tego robić błędogen. On może najwyżej zalogować, co dokładnie poszło nie tak, ale i to bez gwarancji że się uda.
To są absolutne podstawy tworzenia aplikacji robiących coś więcej
@Szarlejowiec: w aplikacji webowej? W widoka/kontrolerze odpowiedzialnych realizujących biznesową funkcjonalność żadnego postępowania z ogólnymi/niespodziewanymi błędami. Łapania wyjątków na tym etapie możesz używać do sterowania przepływem - ale wyjątków spodziewanych (duplikat nazwy użytkownika w bazie danych, file exists itp) - już nie dyskutując czy to ładne czy nie.
Co więcej, error handlery również łapią wyjątki po to żeby zrobić z nimi coś sensownego, z góry zaprojektowanego w aplikacji (wysyłka maila o błędzie
@Pipcieo: mówiąc na przykładzie django, logger często konfiguruje się, żeby przesłał błąd na maila/ podpina się go do sentry, cokolwiek. Zresztą tak jak napisałem - wykonujesz coś, co wiadomo, że może się wykrzaczyć w jakiś dany sposób, łapię ten wyjątek (głupio napisałem Exception, miało być JakisException), logujesz i fallback to usera, niech to będzie nawet return handlethiserror(e)
@Pipcieo: wszystko spoko, tego się używa, ale wydaje mi się, że ja o jednym, a Ty o czym innym :P co jest złego z zalogowaniu, że wystąpił dany error? Potem, jasne, czemu nie, można podnieść 404 czy inny error, albo bezpośrednio odesłać response. Kwestia tego co jest używane w projekcie i jaki jest design. Niektórzy wolą generyczną 500tkę, inni tą samą stronę z popupem o błędzie (django ma całkiem fajny ficzer
@Szarlejowiec: to, że możesz nie być w stanie rzeczywiście tego błędu zalogować (bo np. się zapchał dysk) a error handler już tak (bo ten co go pisał przewidział takie rzeczy). Natomiast ty ten błąd łapiesz i próbując go zalogować w rzeczywistości go maskujesz. Error handler zaloguje... błąd logowania na wyższej warstwie nie widząc rzeczywistego błędu.
I nie, to nie jest kwestia tego kto co woli i jaki jest design. Pewne rzeczy
@Szarlejowiec: Funkcja rzucająca wyjątek != 500 dla usera!
Jeszcze zostaje obsługa tych błędów po stronie kontrolera danego widoku/wywołania ajax itp. itd.
I to właśnie tam ma się odbyć przekształcenie danego obiektu Exception() na coś strawnego dla usera końcowego.