NodeJS bắt các ngoại lệ chưa được xử lý
Trong bài đăng này, tôi sẽ ghi lại một số ghi chú mà tôi đã thực hiện khi tái cấu trúc các quy trình xử lý ngoại lệ chưa được phát hiện trong Node. js. Hy vọng rằng nó có thể hữu ích cho những người khác quan tâm đến phần này của cơ sở mã hoặc cho các nhà khảo cổ mã trong tương lai Show
Lối thoát toàn cầu cho các trường hợp ngoại lệ chưa được phát hiệnCốt lõi của việc xử lý ngoại lệ chưa được phát hiện trong Node. js hiện nằm trong 12 - tên này gần đây đã được đổi tên từ 13, tên này không còn là tên chính xác nữa vì các ngoại lệ được truyền cho nó không nhất thiết gây tử vong sau Node. js đã triển khai lối thoát hiểm 14 khoảng 10 năm trước 12 hiện tại về cơ bản thực hiện hai việc
18 đã phát triển khá nhiều trong những năm qua, nhưng mục đích chính của nó vẫn là phát ra các sự kiện 19 cho người dùng Cũng giống như nhiều thuộc tính khác có tiền tố là dấu gạch dưới, 18 là một chi tiết triển khai đã vô tình bị lộ cho người dùng - có lẽ nó không được dùng nữa vào thời điểm này Những ngoại lệ chưa được phát hiện này đến từ đâu?Hiện tại, có một số nơi có thể gọi 12 1. Trình nghe tin nhắn mỗi lần cô lậptrong nút. js, chỉ có một trình nghe thông báo cho mỗi lần cô lập được thêm vào thông qua function run(er) {6 cho mỗi V8 cô lập (mỗi Nút. js, phiên bản chính hoặc phiên bản worker, được liên kết với một phiên bản V8 riêng biệt). Khi có một ngoại lệ JavaScript được đưa ra (bởi người dùng hoặc bởi Node. js) trong vùng cô lập mà không bị bắt, V8 kích hoạt trình nghe đất C++ này và chúng tôi sẽ chuyển nó vào 12 để người dùng có cơ hội xử lý nó trong lối thoát toàn cầu 2. nội bộ C ++Có một số nơi trong vùng đất C++ nơi 12 được gọi trực tiếp. trong nút. js gọi lại không đồng bộ thường được gọi bởi C++ khi một số hoạt động không đồng bộ được hoàn thành. Các cuộc gọi lại này không được phép tự đưa ra các ngoại lệ - thay vào đó, chúng được cho là chuyển các ngoại lệ xuống các cuộc gọi lại do người dùng cung cấp. Khi họ đưa ra các ngoại lệ không mong muốn (e. g. khi có lỗi), các ngoại lệ này được bắt bởi trình gọi C++, chuyển chúng xuống 12 để chúng có thể được xử lý kịp thời. Nó thường trông như thế này 18 19 Lưu ý rằng 100 này không được dài dòng - nếu nó dài dòng, V8 sẽ gọi trình nghe thông báo per-isoolate với ngoại lệ đó, sau đó chúng ta sẽ xử lý cùng một ngoại lệ hai lần 3. nội bộ JavaScriptCũng có thể kích hoạt 12 từ JavaScript bên trong của Node. js sử dụng 102 - về cơ bản chỉ là một ràng buộc nội bộ cho 12. Điều này được sử dụng để thực hiện e. g. 104, cho phép bạn nắm bắt các lời từ chối lời hứa chưa được xử lý trong sự kiện 19 Trong trường hợp bạn không nhận ra - hàng đợi tác vụ và quy trình xử lý lỗi trong Node. js hầu hết được triển khai bằng JavaScript, đó là lý do tại sao chúng tôi cần cung cấp quy trình này trong vùng đất JavaScript nội bộ In ngoại lệ cho stderr với thông tin bổ sungNếu bạn chạy một tệp có tên 106 trông như thế này 1 function run(er) { Khi trình nhúng không đính kèm trình nghe tin nhắn, theo mặc định, V8 sẽ in ngoại lệ chưa được phát hiện ra thiết bị xuất chuẩn với nội dung như thế này 10 10 Đó là nút. js có nhiệm vụ định dạng lại dấu vết ngăn xếp và in nội dung nào đó có nhiều thông tin hơn cho người dùng, như thế này 11 12 Làm thế nào nút. js tăng cường theo dõi ngăn xếp của một ngoại lệ nghiêm trọngTheo dõi ngăn xếp nâng cao được trình bày ở trên bao gồm ít nhất 2 phần và 2 phần tùy chọn 1. Mã nguồn nơi xảy ra sự cố 2 3 4 5 6 7 |