2011-08-04 18 views
13

Pracuję nad złożoną aplikacją WWW napisaną w Sencha Touch i PhoneGap. Sposób, w jaki pisane są aplikacje Sencha Touch sprawia, że ​​trudno jest objąć każdy potencjalny punkt awarii za pomocą polecenia "próbuj/złap", szczególnie w przypadku asynchronicznych procedur obsługi żądań AJAX.window.onerror nie działa w telefonie komórkowym - jak radzić sobie z nieobsługiwanymi wyjątkami?

Bardzo ważne jest również wykrycie, kiedy wystąpi nieobsługiwany wyjątek, ponieważ wygląda i wygląda jak natywna aplikacja z PhoneGap (tzn. Nie możemy oczekiwać, że odświeży stronę i spróbuje ponownie, jak w aplikacji internetowej wyświetlanej w zwykła przeglądarka).

Czy możesz zasugerować zalecenie dotyczące radzenia sobie z tym scenariuszem?

Odpowiedz

1

To świetne pytanie. Oczywiście zdarzenie window error nigdy nie powinno zastępować strategicznie umieszczonych bloków lub dobrego wykorzystania odpowiedzi na błędy z żądań HTTP, ale dopóki przeglądarki mobilne nie nadrobią zaległości z wersjami desktopów, zgłaszanie naprawdę nieoczekiwanych błędów jest prawie niemożliwe.

Nie mam czasu, aby to przetestować; więc wszystko, co mogę zasugerować to eksperyment myślowy w tej chwili o to, co jest z całą szczerością prawdopodobnie zły pomysł ...

potencjalnie można napisać funkcje zastępcze dla addEventListener (a może dispatchMethod), które mogłyby zawijać rodzimych funkcje/argumenty obsługi z numerem try/catch i wywołaj niestandardowy globalny program do rejestrowania błędów. Ponieważ nie ma prostego sposobu na "podpięcie" tych funkcji na raz, bez wątpienia oznaczałoby to powtórzenie wielu prototypów obiektów rodzimych na window, aby wykonać "zawijanie". Może to dotyczyć znacznej większości wyjątków, które obecnie milczą.

+0

Nie sądzę, że to dobre rozwiązanie. Wolałbym raczej owijać mój kod w blokach try/catch ręcznie niż wstawiać kod, aby zawinąć wszystkie procedury obsługi zdarzeń (w tym programy obsługi zdarzeń w architekturze Sencha Touch) w blokach try/catch automatycznie. Wydaje się, że byłoby to drogie pod względem wydajności i żywotności baterii, a mimo to nie zapewni mi pełnego zasięgu. –

0

Uważam, że nie musi być drogie, aby bezpiecznie owijać wszystkie odpowiednie koperty. Najprawdopodobniej ty (lub Sencha Touch) już polegasz na czymś takim jak jQuery, aby ustanowić procedury obsługi zdarzeń w sposób najbardziej międzyplatformowy. Wszystko konfiguruje niewielka liczba funkcji, więc jest tylko kilka miejsc, które wymagają łatania.

Innymi słowy, nie próbuj łatania na najniższym poziomie (addEventListener każdego węzła). Łap (lub napisz) kilka funkcji bibliotecznych, a następnie zawsze używaj ich do ustanawiania detektorów zdarzeń.

Jeśli najpierw załadujesz swój kod blokowania błędów (zanim ktokolwiek będzie miał okazję pobrać odnośniki do odpowiednich funkcji) i załączysz jQuery.bind i window.setTimeout, uzyskasz całkiem dobry zasięg. W przypadku Ajax istnieją już dobre przechwyty (takie jak jQuery.ajaxPrefilter), w których można wstawić pułapki wyjątków, zawijając procedury obsługi odpowiedzi w zamknięciach.