2017-09-07 22 views
6

Jestem sfrustrowany niezrozumiałymi śladami stosu, gdy mój kod Scala.js zgłasza wyjątek. Myślałem, że mam rozwiązanie przy użyciu biblioteki JavaScript (patrz Getting a scala stacktrace), ale zbyt często się psuje.Scala.js stacktraces

W jaki sposób you ekstrakt znaczenie (gdzie program się zepsuł, jak się tam dostał - w zakresie kodu Scala) z stacktrace jak poniżej. Czy robię coś złego, aby otrzymać nieprzetłumaczony stacktrace?

Sample Scala.js stacktrace

Odpowiedz

5

Spójrz na ten kod pisałem jakiś czas temu w moim youi ram: https://github.com/outr/youi/tree/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap

Jest on stosowany w celu odwrócenia JS ślady stosu, aby ślady stosu Scala. W youi wysyłam błędy na serwer, dzięki czemu mogę monitorować błędy przeglądarki, które pojawiają się przy pełnym prześledzeniu.

krótki przegląd

  1. source-map.js

Trzeba source-map.js do analizowania pliku js.map że Scala.js generowany gdy skompilowany Twój kod. Zobacz: https://github.com/mozilla/source-map

  1. załadować plik js.map poprzez Ajax

SourceMapConsumer potrzebuje js.Object (JSON) pliku js.map. Zobacz https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L58, aby zobaczyć przykład ładowania za pomocą funkcji Ajaksu.

  1. Przetwarza Throwable

Ślad reprezentuje linię i kolumn w pliku JS i można przekazać że informacje SourceMapConsumer dostać oryginalne Scala linia numery z powrotem (patrz SourceMapConsumer.originalPositionFor). Zobacz przykład ErrorTrace.toCause (https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L98) dla przykładu śledzenia iteracji elementów śledzenia Throwable.

  1. obsługi błędów

Teraz, że masz zdolności do przetwarzania błędów JavaScript i konwertować je z powrotem do Scala ślady, trzeba rzeczywiście otrzymać Błędy . Jeśli chcesz globalnie obsługiwać nieprzechwycone błędy, ustaw funkcję na window.onerror, aby przechwytywać błędy. W chwili pisania tego opisu podpis funkcji w Scala.js nie jest idealny do obsługi wszystkich informacji o adresach , więc w razie potrzeby używam js.Dynamic, aby ustawić to, czego potrzebuję (patrz: https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/ClientApplication.scala#L35). Należy również zauważyć, że w obsługuje wiele przychodzących typów błędów (ErrorEvent, Throwable i bardziej ogólny scenariusz). Dzieje się tak dlatego, że w JavaScript błędy pojawiają się na różne sposoby na podstawie na temat tego, co się dzieje. Jest to dość złożony temat i dlatego I- utworzył tę funkcję w youi, aby uprościć rzeczy.

Nie tak krótki przegląd, jak bym chciał, ale nie jest to prosty problem do rozwiązania. Projekt GitHub z mapą źródłową (https://github.com/mozilla/source-map) ma przyzwoitą dokumentację i jest to, co pierwotnie użyłem do napisania mojego rozwiązania (z pewnymi dodatkowymi próbami i błędami). Jeśli podane przeze mnie informacje są niekompletne, polecam lekturę tam, ponieważ powinna ona dostarczyć większości informacji i prawdopodobnie lepiej wytłumaczyć.

+0

Dzięki. Na wysokim poziomie kod ma dla mnie sens. Cieszę się, że zagłębiam się w to, gdy tylko skończę bieżące zadanie. Dla osób, które mnie śledzą, pomocne okazało się odnalezienie instalacji obsługi błędów w ClientApplication w wierszu 35. – bwbecker

+1

Czy możesz skonsolidować tę odpowiedź z bardziej stabilnymi linkami? Wskaźniki do opanowania prawdopodobnie będą pękać w przyszłości. Najlepiej byłoby, gdyby najważniejsze fragmenty były tu reprodukowane zgodnie z zaleceniami SO, chyba że są one naprawdę zbyt długie. – sjrd