2017-09-07 14 views
6

Tôi thất vọng bởi các stacktraces khó hiểu khi mã Scala.js của tôi ném một ngoại lệ. Tôi nghĩ rằng tôi đã có một giải pháp bằng cách sử dụng một thư viện Javascript (xem Getting a scala stacktrace) nhưng nó phá vỡ quá thường xuyên.Scala.js stacktraces

Làm cách nào để bạn trích xuất ý nghĩa (trong đó chương trình bị hỏng; cách thức nó đã đến đó - trong điều khoản của mã Scala) từ một stacktrace như sau. Hoặc tôi đang làm điều gì đó sai để thậm chí có được một stacktrace chưa dịch?

Sample Scala.js stacktrace

Trả lời

5

Hãy nhìn vào mã này tôi đã viết một thời gian trở lại trong khuôn khổ youi tôi: https://github.com/outr/youi/tree/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap

Nó được sử dụng để đảo ngược JS đống dấu vết để Scala đống dấu vết. Trong youi tôi gửi lỗi đến máy chủ để tôi có thể theo dõi các lỗi trình duyệt xảy ra với truy xuất hoàn chỉnh.

Giới thiệu tóm tắt Tổng quan

  1. nguồn map.js

Bạn cần nguồn map.js để phân tích các tập tin js.map rằng Scala.js tạo ra khi nó được biên dịch ma cua ban. Xem: https://github.com/mozilla/source-map

  1. tải file js.map qua Ajax

Các SourceMapConsumer cần một js.Object (JSON) của tập tin js.map. Xem https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L58 để biết ví dụ về tải thông qua các tính năng Ajax của youi.

  1. Process các Throwable

Các dấu vết đại diện cho dòng và cột trong file JS và bạn có thể vượt qua thông tin đó để SourceMapConsumer để có được bản gốc Scala dòng các số quay lại (xem SourceMapConsumer.originalPositionFor). Xem ErrorTrace.toCause (https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L98) để có ví dụ lặp qua các thành phần vi lượng của Throwable.

  1. lỗi Xử lý

Bây giờ bạn có khả năng để xử lý các lỗi JavaScript và chuyển đổi chúng trở lại Scala dấu vết, bạn cần phải thực sự nhận được lỗi. Nếu bạn muốn xử lý toàn cục các lỗi không xác định, hãy đặt hàm thành window.onerror để nắm bắt lỗi. Theo văn bản này, chữ ký chức năng trong Scala.js không lý tưởng để xử lý tất cả thông tin , vì vậy trong youi tôi sử dụng js.Dynamic để đặt nó thành những gì tôi cần (xem: https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/ClientApplication.scala#L35). Ngoài ra, hãy lưu ý rằng trong ErrorTrace, nó hỗ trợ nhiều loại đến lỗi (ErrorEvent, Throwable và một trường hợp chung chung hơn). Điều này là do trong JavaScript, các lỗi xảy ra theo các cách khác nhau dựa trên những gì đang xảy ra trên trang . Đây là một chủ đề khá phức tạp và tại sao tôi đã tạo chức năng này trong youi để đơn giản hóa mọi thứ.

Không gần như tổng quan ngắn gọn như tôi muốn, nhưng đây không phải là vấn đề đơn giản để giải quyết. Dự án GitHub nguồn (https://github.com/mozilla/source-map) có tài liệu phong phú và là những gì tôi sử dụng ban đầu để viết giải pháp của tôi (với một số thử nghiệm và lỗi bổ sung). Nếu thông tin tôi cung cấp không đầy đủ, tôi khuyên bạn nên đọc nhiều hơn vì nó sẽ cung cấp phần lớn thông tin và có thể giải thích rõ hơn.

+0

Cảm ơn. Ở mức độ cao, mã có ý nghĩa với tôi. Tôi sẽ tận hưởng việc đào sâu vào nó ngay sau khi tôi hoàn thành nhiệm vụ hiện tại của mình. Đối với những người theo dõi tôi, việc tìm kiếm cài đặt trình xử lý lỗi trong ứng dụng ClientApplication ở dòng 35 là hữu ích. – bwbecker

+1

Bạn có thể hợp nhất câu trả lời này với các liên kết ổn định hơn không? Con trỏ để làm chủ có khả năng phá vỡ trong tương lai. Lý tưởng nhất là các đoạn mã quan trọng nhất phải được sao chép ở đây để thực hiện theo các khuyến nghị của SO, trừ khi chúng thực sự quá dài. – sjrd

Các vấn đề liên quan