Temat: kontrola błędów sql
Andrzej Prażmo:
"Nie licząc sytuacji newralgicznych jak np pobranie uprawnień albo danych użytkownika, większość tego co wyświetlamy na ekranie jest kompletnie ZBĘDNA. Co za tym idzie - jeżeli baza zwróciła błąd, ten fakt powinien być gdzieś zalogowany (nietrudno to wykryć w końcu a jeszcze łatwiej zrzucić dane do pliku albo psiakoś inaczej ) a aplikacja powinna działać dalej bez wiedzy użytkownika."
Powyższy cytat jest dla mnie dość jasny: owszem, zapisujmy sobie gdzieś błędy ale użytkownik lepiej, żeby o nich nie wiedział. Ja się z takim stylem programowania nie zgadzam i tyle. Głównie dlatego, że uważam użytkownika za bardzo istotny "składnik" aplikacji, który daje mi więcej informacji na temat działania programu niż stado testerów.
Na przykładzie zdjęcia które wstawiłem wcześniej. Tak dla jasności.
Jest tam parę czerwonych obszarów. Weźmy "polecane galerie". Tam gdzieś jest zapytanie sql, jakiś skrypt czy cuś co pobierze kilka popularnych albo wybranych przez gry-online galerii.
Powiedzmy że jest piątek wieczór a ktoś się upiera żeby zaktualizować ten obszar o nowy algorytm który np wyeliminuje konieczność przygotowania listy. Więc ktoś pisze, pisze, pisze i puszcza aktualizacje. "Jemu działa" więc idzie do domu nie wiedząc że z jakiegoś powodu każdemu innemu użytkownikowi wyrzuca błąd zapytania. Hipotetyczna sytuacja.
Pańskie podejście - gdzieś pojawia się błąd w związku z tym blokiem i pojawia się cały weekend. Albo w miejscu występowania bloku, albo w innym miejscu witryny albo coś...
Moje podejście - kontrola błędów wyłapuje ów błąd a mechanizm składnia strony pomija blok z błędem. Ewentualnie prostsze rozwiązanie - lista się nie wyświetla.
Pańskie podejście - użytkownicy widzą informacje o błędzie i zyskują wiedzę na temat naszej aplikacji która może być wykorzystana w dobry lub zły sposób. Znam multum takich przypadków gdzie wyrzucony błąd serwował nam lokalizację pliku, backtrace zdarzenia czy nawet zapytanie SQL które zdradza strukturę tabeli co może np później pomóc w SQL Injection. Spotkałem się nawet z sytuacjami gdzie wywalenie się bazy danych skutkowało z pokazaniem fragmentu odpowiedzialnego za połączenie zawierający login i hasło do bazy...
DO WYBORU, DO KOLORU
Moje podejście - użytkownik nawet nie zauważył że coś się stało. Na mojej skrzynce email jest informacja o wystąpieniu błędu którą to wysłała sama aplikacja. W logach aplikacji mam
~ czas zdarzenia
~ miejsce zdarzenia
~ komunikat zdarzenia
~ użytkownika któremu to się stało
~ backtrace
~ wykonane zapytania
~ zawartość superglobals z początku skryptu i miejsca wystąpienia błędu
To niemal wszystko co jest mi potrzebne do poprawki błędu. A jeżeli nie dojdę to aa pomocą JEDNEGO GŁUPIEGO SKYPTU jaki posiada mój panel administracyjny mogę sobie wybrać błąd z raportu i wywołać stronę mającą dokładnie ten sam stan (skrypt przywraca sesję początkową z programu, wywołuje URL wraz z ewentualnymi danymi przesłanego formularza itp) i dokładnie prześledzić co się stało.
Pytanie: w jaki sposób może mi pomóc użytkownik ?? Aplikacja loguje niemal wszystkie anomalie jakie się wydarzą a z funkcją która podał mi Krzysztof może logować wszystkie. Użytkownik tutaj się przydaje wtedy kiedy to skrypt aplikacji jest nieprawidłowy i daje błędne wyniki ale tutaj błędy się NIE POJAWIĄ i tutaj użytkownik anomalię i tak zauważy.
Pytanie 2: Czy Pan w swoim świętym przekonaniu o tym że robię źle nie myli przypadkiem INFORMOWANIA użytkownika że coś się np nie zapisało z RADZENIEM SOBIE Z BŁĘDAMI i kontynuowaniem aplikacji jeżeli to możliwe ?
Ja nie widzę problemu w tym że ktoś walną literówkę w SELECT. Użytkownik nie dostaje informacji jakie ów SELECT miał dla niego pobrać i jeżeli nie jest to potrzebne (jak te polecane galerie) to nawet nie dowie się że coś takiego MIAŁ dostać a ja dostanę w tym samym momencie informacje że SELECT ma literówkę, poprawię go i wszystko wróci do normy. Pytania ?
I tu dochodzimy do różnicy między gry-online.pl a np intranetem firmy. Na gry-online.pl blok który wygenerował błąd wyrzucił by wyjątek dla kontrolera który zajmuje się generowaniem strony. Kontroler wyłapał by błąd i nie dołączył by owego obszaru do strony. Więc blok by się nie pojawił.
W Intranecie ów blok by się pojawił ale w miejscu listy była by notka że z powodu awarii lub błędu informacja nie wyświetla się bo intranety na ogół nie zawierają zbędnych informacji w widokach.
Trzeba być elastycznym a nie iść w zaparte.
Dariusz Półtorak edytował(a) ten post dnia 27.05.12 o godzinie 11:19