Đặc biệt, có những tình huống mà chúng tôi có thể muốn dừng chương trình hoặc thông báo cho người dùng nếu có điều gì đó tồi tệ xảy ra
Ví dụ
- chương trình đã cố mở một tệp không tồn tại
- kết nối mạng bị hỏng
- người dùng đã nhập đầu vào không hợp lệ
Trong tất cả các trường hợp này, chúng tôi với tư cách là lập trình viên, tạo ra lỗi hoặc chúng tôi để công cụ lập trình tạo ra một số lỗi cho chúng tôi
Sau khi tạo lỗi, chúng tôi có thể thông báo cho người dùng bằng một tin nhắn hoặc chúng tôi có thể tạm dừng thực thi hoàn toàn
Lỗi trong JavaScript là gì?
Một lỗi trong JavaScript là một đối tượng, sau đó được ném ra để tạm dừng chương trình
Để tạo một lỗi mới trong JavaScript, chúng tôi gọi hàm xây dựng thích hợp. Ví dụ: để tạo một lỗi mới, chung chung, chúng ta có thể thực hiện
const err = new Error["Something bad happened!"];
Khi tạo đối tượng lỗi cũng có thể bỏ qua từ khóa
Uncaught DOMException: Node.appendChild: May not add a Document as a child
5const err = Error["Something bad happened!"];
Sau khi được tạo, đối tượng lỗi trình bày ba thuộc tính
6. một chuỗi có thông báo lỗiUncaught DOMException: Node.appendChild: May not add a Document as a child
7. loại lỗiUncaught DOMException: Node.appendChild: May not add a Document as a child
8. dấu vết ngăn xếp của việc thực thi chức năngUncaught DOMException: Node.appendChild: May not add a Document as a child
Ví dụ: nếu chúng tôi tạo một đối tượng
Uncaught DOMException: Node.appendChild: May not add a Document as a child
9 mới với thông báo thích hợp, thì Uncaught DOMException: Node.appendChild: May not add a Document as a child
6 sẽ mang chuỗi lỗi thực tế, trong khi Uncaught DOMException: Node.appendChild: May not add a Document as a child
7 sẽ là const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
2Uncaught DOMException: Node.appendChild: May not add a Document as a child
0Firefox cũng triển khai một loạt các thuộc tính không chuẩn như
const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
3, const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
4 và const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
5Nhiều loại lỗi trong JavaScript
Có nhiều loại lỗi trong JavaScript, cụ thể là
6const wrongType = TypeError["Wrong type given, expected number"]; throw wrongType;
7const wrongType = TypeError["Wrong type given, expected number"]; throw wrongType;
8const wrongType = TypeError["Wrong type given, expected number"]; throw wrongType;
9const wrongType = TypeError["Wrong type given, expected number"]; throw wrongType;
00const err = Error["Something bad happened!"];
01const err = Error["Something bad happened!"];
9Uncaught DOMException: Node.appendChild: May not add a Document as a child
03const err = Error["Something bad happened!"];
Hãy nhớ rằng, tất cả các loại lỗi này là các hàm tạo thực tế có nghĩa là trả về một đối tượng lỗi mới
Trong mã của bạn, bạn sẽ chủ yếu sử dụng
const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
6 và Uncaught DOMException: Node.appendChild: May not add a Document as a child
9, hai trong số các loại phổ biến nhất, để tạo đối tượng lỗi của riêng bạnHầu hết thời gian, phần lớn lỗi sẽ đến trực tiếp từ công cụ JavaScript, như
const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
8 hoặc const err = Error["Something bad happened!"];
01Một ví dụ về
Uncaught DOMException: Node.appendChild: May not add a Document as a child
9 xảy ra khi bạn cố gán lại const err = Error["Something bad happened!"];
09const err = Error["Something bad happened!"];
8Một ví dụ về
const err = Error["Something bad happened!"];
01 là khi bạn viết sai từ khóa ngôn ngữUncaught DOMException: Node.appendChild: May not add a Document as a child
0Hoặc khi bạn sử dụng các từ khóa dành riêng ở những vị trí không phù hợp, chẳng hạn như
const err = Error["Something bad happened!"];
11 bên ngoài hàm const err = Error["Something bad happened!"];
12Uncaught DOMException: Node.appendChild: May not add a Document as a child
3Một ví dụ khác về
Uncaught DOMException: Node.appendChild: May not add a Document as a child
9 xảy ra khi chúng tôi chọn các phần tử HTML không tồn tại trong trangUncaught DOMException: Node.appendChild: May not add a Document as a child
5Ngoài các đối tượng lỗi truyền thống này, một đối tượng
const err = Error["Something bad happened!"];
14 sẽ sớm xuất hiện trong JavaScript. const err = Error["Something bad happened!"];
14 thuận tiện cho việc gói nhiều lỗi lại với nhau, như chúng ta sẽ thấy sauBên cạnh những lỗi tích hợp này, trong trình duyệt, chúng ta cũng có thể tìm thấy
16const err = Error["Something bad happened!"];
17, không dùng nữa và ngày nay không còn được sử dụngconst err = Error["Something bad happened!"];
const err = Error["Something bad happened!"];
16 là một nhóm lỗi liên quan đến API Web. Chúng bị ném khi chúng ta làm những việc ngớ ngẩn trong trình duyệt, nhưUncaught DOMException: Node.appendChild: May not add a Document as a child
1Kết quả
Uncaught DOMException: Node.appendChild: May not add a Document as a child
Để biết danh sách đầy đủ, hãy xem trang này trên MDN
Ngoại lệ là gì?
Hầu hết các nhà phát triển nghĩ rằng lỗi và ngoại lệ là giống nhau. Trong thực tế, một đối tượng lỗi chỉ trở thành ngoại lệ khi nó được ném ra
Để đưa ra một ngoại lệ trong JavaScript, chúng tôi sử dụng
const err = Error["Something bad happened!"];
19, theo sau là đối tượng lỗiconst wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
Dạng ngắn phổ biến hơn, trong hầu hết các cơ sở mã, bạn sẽ tìm thấy
const err = Error["Something bad happened!"];
0hoặc
const err = Error["Something bad happened!"];
1Không có khả năng ném ngoại lệ ra ngoài hàm hoặc khối điều kiện. Thay vào đó, hãy xem xét ví dụ sau
const err = Error["Something bad happened!"];
2Ở đây chúng tôi kiểm tra xem đối số hàm có phải là một chuỗi không. Nếu không phải chúng ta ném một ngoại lệ
Về mặt kỹ thuật, bạn có thể ném bất cứ thứ gì vào JavaScript, không chỉ các đối tượng lỗi
const err = Error["Something bad happened!"];
3Tuy nhiên, tốt hơn là nên tránh những điều này. luôn ném các đối tượng lỗi thích hợp, không phải nguyên thủy
Bằng cách đó, bạn giữ cho việc xử lý lỗi nhất quán thông qua cơ sở mã. Các thành viên khác trong nhóm luôn có thể truy cập vào
const err = Error["Something bad happened!"];
20 hoặc const err = Error["Something bad happened!"];
21 trên đối tượng lỗiĐiều gì xảy ra khi chúng ta ném một ngoại lệ?
Ngoại lệ giống như thang máy đi lên. khi bạn ném một cái, nó sẽ nổi lên trong ngăn xếp chương trình, trừ khi nó bị bắt ở đâu đó
Hãy xem xét đoạn mã sau
const err = Error["Something bad happened!"];
4Nếu bạn chạy mã này trong trình duyệt hoặc trong Node. js thì chương trình dừng và báo lỗi
const err = Error["Something bad happened!"];
5Ngoài ra, bạn có thể xem chính xác dòng xảy ra lỗi
Báo cáo này là theo dõi ngăn xếp và rất hữu ích để theo dõi các sự cố trong mã của bạn
Dấu vết ngăn xếp đi từ dưới lên trên. Nên ở đây
const err = Error["Something bad happened!"];
6Chúng ta có thể nói
- một cái gì đó trong chương trình ở dòng 9 được gọi là
22const err = Error["Something bad happened!"];
22 nổ tung ở dòng 3const err = Error["Something bad happened!"];
Ngoài việc xem dấu vết ngăn xếp này trong bảng điều khiển của trình duyệt, bạn có thể truy cập nó trên thuộc tính
Uncaught DOMException: Node.appendChild: May not add a Document as a child
8 của đối tượng lỗiNếu ngoại lệ không được phát hiện, nghĩa là lập trình viên không làm gì để bắt nó, chương trình sẽ bị lỗi
Khi nào và ở đâu bạn bắt gặp một ngoại lệ trong mã của mình tùy thuộc vào trường hợp sử dụng cụ thể
Ví dụ: bạn có thể muốn truyền một ngoại lệ lên trong ngăn xếp để làm hỏng chương trình hoàn toàn. Điều này có thể xảy ra đối với các lỗi nghiêm trọng, khi dừng chương trình sẽ an toàn hơn là làm việc với dữ liệu không hợp lệ
Đã giới thiệu những kiến thức cơ bản, giờ hãy chuyển sự chú ý của chúng ta sang xử lý lỗi và ngoại lệ trong cả mã JavaScript đồng bộ và không đồng bộ
Xử lý lỗi đồng bộ
Mã đồng bộ hầu hết đều đơn giản và do đó việc xử lý lỗi của nó
Xử lý lỗi cho các chức năng thông thường
Mã đồng bộ được thực thi theo cùng thứ tự được viết. Hãy lấy lại ví dụ trước
const err = Error["Something bad happened!"];
4Tại đây, động cơ gọi và thực thi
const err = Error["Something bad happened!"];
22. Tất cả diễn ra đồng bộ. Để bắt một ngoại lệ bắt nguồn từ chức năng đồng bộ như vậy, chúng ta có thể sử dụng const err = Error["Something bad happened!"];
26const err = Error["Something bad happened!"];
8Thông thường,
const err = Error["Something bad happened!"];
27 xử lý đường dẫn hạnh phúc hoặc với lệnh gọi hàm có khả năng némThay vào đó,
const err = Error["Something bad happened!"];
28 ghi lại ngoại lệ thực tế. Nó nhận đối tượng lỗi mà chúng ta có thể kiểm tra [và gửi từ xa tới một số bộ ghi trong sản xuất]Mặt khác, câu lệnh
const err = Error["Something bad happened!"];
29 chạy bất kể kết quả của hàm. dù thất bại hay thành công, mọi mã bên trong const err = Error["Something bad happened!"];
29 sẽ chạyNhớ lại.
const err = Error["Something bad happened!"];
26 là một cấu trúc đồng bộ. giờ đây nó có cách để bắt các ngoại lệ đến từ mã không đồng bộXử lý lỗi cho các chức năng của trình tạo
Hàm tạo trong JavaScript là một loại hàm đặc biệt
Nó có thể được tạm dừng và tiếp tục theo ý muốn, ngoài việc cung cấp kênh liên lạc hai chiều giữa phạm vi bên trong của nó và người tiêu dùng
Để tạo hàm tạo, chúng tôi đặt dấu sao
const err = Error["Something bad happened!"];
32 sau từ khóa const err = Error["Something bad happened!"];
33const err = Error["Something bad happened!"];
9Khi đã ở trong hàm, chúng ta có thể sử dụng
const err = Error["Something bad happened!"];
34 để trả về giá trịUncaught DOMException: Node.appendChild: May not add a Document as a child
00Giá trị trả về từ hàm tạo là một đối tượng lặp. Để lấy các giá trị ra khỏi trình tạo, chúng ta có thể sử dụng hai cách tiếp cận
- gọi
35 trên đối tượng iteratorconst err = Error["Something bad happened!"];
- lặp lại với
36const err = Error["Something bad happened!"];
Nếu chúng ta lấy ví dụ của mình, để lấy các giá trị từ trình tạo, chúng ta có thể làm
Uncaught DOMException: Node.appendChild: May not add a Document as a child
01Ở đây
const err = Error["Something bad happened!"];
37 trở thành đối tượng iterator của chúng ta khi chúng ta gọi hàm tạoTừ giờ trở đi, chúng ta có thể gọi
const err = Error["Something bad happened!"];
38 để tiến hành thực hiệnUncaught DOMException: Node.appendChild: May not add a Document as a child
02Máy phát điện cũng hoạt động theo cách khác. họ có thể chấp nhận các giá trị và ngoại lệ từ người gọi
Ngoài
const err = Error["Something bad happened!"];
35, các đối tượng trình vòng lặp được trả về từ trình tạo có phương thức const err = Error["Something bad happened!"];
40Với phương pháp này, chúng ta có thể tạm dừng chương trình bằng cách đưa một ngoại lệ vào trình tạo
Uncaught DOMException: Node.appendChild: May not add a Document as a child
03Để bắt lỗi như vậy, bạn sẽ bọc mã của mình bên trong trình tạo bằng
const err = Error["Something bad happened!"];
41 [và const err = Error["Something bad happened!"];
29 nếu cần]Uncaught DOMException: Node.appendChild: May not add a Document as a child
04Hàm tạo cũng có thể ném ngoại lệ ra bên ngoài. Cơ chế bắt các ngoại lệ này giống như cơ chế bắt các ngoại lệ đồng bộ.
const err = Error["Something bad happened!"];
26Đây là một ví dụ về hàm tạo được sử dụng từ bên ngoài với
const err = Error["Something bad happened!"];
36Uncaught DOMException: Node.appendChild: May not add a Document as a child
05Ở đây chúng tôi lặp lại con đường hạnh phúc bên trong một khối
const err = Error["Something bad happened!"];
27. Nếu có bất kỳ trường hợp ngoại lệ nào xảy ra, chúng tôi sẽ dừng nó bằng const err = Error["Something bad happened!"];
28Xử lý lỗi không đồng bộ
JavaScript về bản chất là đồng bộ, là một ngôn ngữ đơn luồng
Các môi trường lưu trữ như công cụ trình duyệt tăng cường JavaScript bằng một số API Web để tương tác với các hệ thống bên ngoài và để xử lý các hoạt động liên kết I/O
Ví dụ về tính không đồng bộ trong trình duyệt là thời gian chờ, sự kiện, Lời hứa
Xử lý lỗi trong thế giới không đồng bộ khác với đối tác đồng bộ của nó
Hãy xem một số ví dụ
Xử lý lỗi cho bộ hẹn giờ
Khi bắt đầu khám phá JavaScript, sau khi tìm hiểu về
const err = Error["Something bad happened!"];
26, bạn có thể muốn đặt nó xung quanh bất kỳ khối mã nàoHãy xem xét đoạn mã sau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
06Chức năng này ném sau khoảng 1 giây. Cách đúng để xử lý ngoại lệ này là gì?
Ví dụ sau không hoạt động
Uncaught DOMException: Node.appendChild: May not add a Document as a child
07Như chúng tôi đã nói,
const err = Error["Something bad happened!"];
41 là đồng bộ. Mặt khác, chúng tôi có const err = Error["Something bad happened!"];
49, API trình duyệt dành cho bộ hẹn giờVào thời điểm cuộc gọi lại được chuyển cho
const err = Error["Something bad happened!"];
49 chạy, thì const err = Error["Something bad happened!"];
41 của chúng tôi đã hết từ lâu. Chương trình sẽ gặp sự cố vì chúng tôi không nắm bắt được ngoại lệHọ đi trên hai con đường khác nhau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
08Nếu chúng tôi không muốn làm hỏng chương trình, để xử lý lỗi một cách chính xác, chúng tôi phải di chuyển
const err = Error["Something bad happened!"];
41 bên trong cuộc gọi lại cho const err = Error["Something bad happened!"];
49Nhưng, cách tiếp cận này không có nhiều ý nghĩa trong hầu hết thời gian. Như chúng ta sẽ thấy ở phần sau, việc xử lý lỗi không đồng bộ với Promise mang lại một công thái học tốt hơn.
Xử lý lỗi cho các sự kiện
Các nút HTML trong Mô hình đối tượng tài liệu được kết nối với
const err = Error["Something bad happened!"];
54, tổ tiên chung cho bất kỳ trình phát sự kiện nào trong trình duyệtĐiều đó có nghĩa là chúng ta có thể lắng nghe các sự kiện trên bất kỳ phần tử HTML nào trong trang
[Nút. js sẽ hỗ trợ
const err = Error["Something bad happened!"];
54 trong bản phát hành trong tương lai]Cơ chế xử lý lỗi cho các sự kiện DOM tuân theo cùng một lược đồ của bất kỳ API Web không đồng bộ nào
Xem xét ví dụ sau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
09Ở đây chúng tôi đưa ra một ngoại lệ ngay khi nút được nhấp. Làm thế nào để chúng ta bắt nó?
const err = Error["Something bad happened!"];
80Như với ví dụ trước với
const err = Error["Something bad happened!"];
49, bất kỳ cuộc gọi lại nào được chuyển đến const err = Error["Something bad happened!"];
57 đều được thực thi không đồng bộconst err = Error["Something bad happened!"];
81Nếu chúng tôi không muốn làm hỏng chương trình, để xử lý lỗi một cách chính xác, chúng tôi phải di chuyển
const err = Error["Something bad happened!"];
41 bên trong cuộc gọi lại cho const err = Error["Something bad happened!"];
57Nhưng một lần nữa, có rất ít giá trị khi làm điều này
Như với
const err = Error["Something bad happened!"];
49, ngoại lệ được ném bởi đường dẫn mã không đồng bộ sẽ không thể bắt được từ bên ngoài và sẽ làm hỏng chương trình của bạnTrong các phần tiếp theo, chúng ta sẽ xem cách Promise và
const err = Error["Something bad happened!"];
61 có thể dễ dàng xử lý lỗi đối với mã không đồng bộLàm thế nào về onerror?
Các phần tử HTML có một số trình xử lý sự kiện như
const err = Error["Something bad happened!"];
62, const err = Error["Something bad happened!"];
63, const err = Error["Something bad happened!"];
64 để đặt tên cho một sốNgoài ra còn có
const err = Error["Something bad happened!"];
65, nhưng không liên quan gì đến const err = Error["Something bad happened!"];
19 và các bạnTrình xử lý sự kiện
const err = Error["Something bad happened!"];
65 kích hoạt bất kỳ lúc nào một phần tử HTML như thẻ const err = Error["Something bad happened!"];
68 hoặc const err = Error["Something bad happened!"];
69 chạm vào tài nguyên không tồn tạiXem xét ví dụ sau
const err = Error["Something bad happened!"];
82Khi truy cập tài liệu HTML có tài nguyên bị thiếu hoặc không tồn tại, bảng điều khiển của trình duyệt sẽ ghi lại lỗi
const err = Error["Something bad happened!"];
83Trong JavaScript của chúng tôi, chúng tôi có cơ hội "bắt" lỗi này bằng trình xử lý sự kiện thích hợp
const err = Error["Something bad happened!"];
84Hoặc tốt hơn
const err = Error["Something bad happened!"];
85Mẫu này hữu ích để tải các tài nguyên thay thế thay cho hình ảnh hoặc tập lệnh bị thiếu
Nhưng hãy nhớ.
const err = Error["Something bad happened!"];
65, không liên quan gì đến const err = Error["Something bad happened!"];
19 hoặc const err = Error["Something bad happened!"];
41Xử lý lỗi với Promise
Để minh họa việc xử lý lỗi với Promise, chúng tôi sẽ "promisify" một trong những ví dụ ban đầu của chúng tôi. Chúng tôi tinh chỉnh chức năng sau
const err = Error["Something bad happened!"];
4Thay vì trả về một chuỗi đơn giản hoặc một ngoại lệ, chúng tôi sử dụng
const err = Error["Something bad happened!"];
73 và const err = Error["Something bad happened!"];
74 tương ứng để xử lý lỗi và thành côngconst err = Error["Something bad happened!"];
87[Về mặt kỹ thuật, không có gì là không đồng bộ trong mã này, nhưng nó phục vụ tốt để minh họa điểm]
Bây giờ hàm đã được "promisified", chúng ta có thể đính kèm
const err = Error["Something bad happened!"];
75 để sử dụng kết quả và const err = Error["Something bad happened!"];
28 để xử lý Lời hứa bị từ chốiconst err = Error["Something bad happened!"];
88Mã này sẽ đăng nhập
const err = Error["Something bad happened!"];
89Trong lĩnh vực Promise,
const err = Error["Something bad happened!"];
28 là cấu trúc để xử lý lỗiNgoài
const err = Error["Something bad happened!"];
28 và const err = Error["Something bad happened!"];
75 chúng ta còn có const err = Error["Something bad happened!"];
29, tương tự như const err = Error["Something bad happened!"];
29 trong const err = Error["Something bad happened!"];
41Là "họ hàng" đồng bộ của nó, Promise's
const err = Error["Something bad happened!"];
29 chạy bất kể kết quả của Promise là gìUncaught DOMException: Node.appendChild: May not add a Document as a child
00Luôn ghi nhớ rằng bất kỳ cuộc gọi lại nào được chuyển đến
const err = Error["Something bad happened!"];
84 đều được xử lý không đồng bộ bởi Hàng đợi Microtask. Chúng là các tác vụ vi mô được ưu tiên hơn các tác vụ vĩ mô, chẳng hạn như các sự kiện và bộ hẹn giờLời hứa, lỗi và ném
Như một phương pháp hay nhất khi từ chối một Lời hứa, thật tiện lợi khi cung cấp một đối tượng lỗi
Uncaught DOMException: Node.appendChild: May not add a Document as a child
01Bằng cách đó, bạn giữ cho việc xử lý lỗi nhất quán thông qua cơ sở mã. Các thành viên khác trong nhóm luôn có thể truy cập vào
const err = Error["Something bad happened!"];
20 và quan trọng hơn là bạn có thể kiểm tra dấu vết ngăn xếpNgoài
const err = Error["Something bad happened!"];
73, chúng ta có thể thoát khỏi Promise chain bằng cách ném một ngoại lệXem xét ví dụ sau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
02Chúng tôi giải quyết một Lời hứa bằng một chuỗi và sau đó chuỗi bị phá vỡ ngay lập tức với
const err = Error["Something bad happened!"];
19Để ngăn chặn việc lan truyền ngoại lệ, chúng tôi sử dụng
const err = Error["Something bad happened!"];
28, như thường lệUncaught DOMException: Node.appendChild: May not add a Document as a child
03Mẫu này phổ biến trong
const err = Error["Something bad happened!"];
89, nơi chúng tôi kiểm tra đối tượng phản hồi để tìm lỗiUncaught DOMException: Node.appendChild: May not add a Document as a child
04Ở đây, ngoại lệ có thể bị chặn bằng
const err = Error["Something bad happened!"];
28. Nếu chúng tôi thất bại hoặc quyết định không bắt nó ở đó, ngoại lệ sẽ tự do nổi lên trong ngăn xếpBản thân điều này không tệ, nhưng các môi trường khác nhau sẽ phản ứng khác nhau đối với các lần từ chối chưa được xử lý
Nút. js chẳng hạn trong tương lai sẽ làm sập bất kỳ chương trình nào mà từ chối Promise không được xử lý
Uncaught DOMException: Node.appendChild: May not add a Document as a child
05Tốt hơn bạn nên bắt chúng
Xử lý lỗi cho bộ hẹn giờ "được hứa hẹn"
Với bộ hẹn giờ hoặc sự kiện, không thể bắt ngoại lệ từ cuộc gọi lại. Chúng ta đã thấy một ví dụ trong phần trước
Uncaught DOMException: Node.appendChild: May not add a Document as a child
06Một giải pháp do Promise cung cấp bao gồm việc "quảng cáo" mã của chúng tôi. Về cơ bản, chúng tôi kết thúc bộ đếm thời gian của mình bằng một Lời hứa
Uncaught DOMException: Node.appendChild: May not add a Document as a child
07Với
const err = Error["Something bad happened!"];
91, chúng tôi bắt đầu từ chối Promise, mang đối tượng lỗiTại thời điểm này, chúng ta có thể xử lý ngoại lệ với
const err = Error["Something bad happened!"];
28Uncaught DOMException: Node.appendChild: May not add a Document as a child
08Ghi chú. thường sử dụng
const err = Error["Something bad happened!"];
93 làm giá trị trả về từ Lời hứa và const err = Error["Something bad happened!"];
94 làm đối tượng trả về từ một từ chốiNút. js có một tiện ích gọi là promisify để giảm bớt việc "quảng cáo" các API gọi lại kiểu cũ
Xử lý lỗi trong Promise. tất cả các
Phương thức tĩnh
const err = Error["Something bad happened!"];
95 chấp nhận một mảng Lời hứa và trả về một mảng kết quả từ tất cả các Lời hứa đang giải quyếtUncaught DOMException: Node.appendChild: May not add a Document as a child
09Nếu bất kỳ Lời hứa nào trong số này bị từ chối, thì
const err = Error["Something bad happened!"];
95 sẽ từ chối với lỗi từ Lời hứa bị từ chối đầu tiênĐể xử lý những tình huống này trong
const err = Error["Something bad happened!"];
95, chúng tôi sử dụng const err = Error["Something bad happened!"];
28, như chúng tôi đã làm trong phần trướcUncaught DOMException: Node.appendChild: May not add a Document as a child
30Để chạy một chức năng bất kể kết quả của
const err = Error["Something bad happened!"];
95, một lần nữa, chúng ta có thể sử dụng const err = Error["Something bad happened!"];
29Uncaught DOMException: Node.appendChild: May not add a Document as a child
31Xử lý lỗi trong Promise. không tí nào
Chúng ta có thể coi
Uncaught DOMException: Node.appendChild: May not add a Document as a child
001 [Firefox > 79, Chrome > 85] đối lập với const err = Error["Something bad happened!"];
95Trong khi
const err = Error["Something bad happened!"];
95 trả về lỗi ngay cả khi một Lời hứa duy nhất trong mảng bị từ chối, thì Uncaught DOMException: Node.appendChild: May not add a Document as a child
001 luôn cung cấp cho chúng ta Lời hứa được giải quyết đầu tiên [nếu có trong mảng] bất kể có bất kỳ sự từ chối nào xảy raTrong trường hợp thay vào đó, tất cả Lời hứa được chuyển đến
Uncaught DOMException: Node.appendChild: May not add a Document as a child
001 từ chối, lỗi kết quả là một const err = Error["Something bad happened!"];
14. Xem xét ví dụ sauUncaught DOMException: Node.appendChild: May not add a Document as a child
32Ở đây chúng tôi xử lý lỗi với
const err = Error["Something bad happened!"];
28. Đầu ra của mã này làUncaught DOMException: Node.appendChild: May not add a Document as a child
33Đối tượng
const err = Error["Something bad happened!"];
14 có cùng các thuộc tính của một const wrongType = TypeError["Wrong type given, expected number"];
throw wrongType;
6 cơ bản, cộng với một thuộc tính Uncaught DOMException: Node.appendChild: May not add a Document as a child
010Uncaught DOMException: Node.appendChild: May not add a Document as a child
34Thuộc tính này là một mảng của từng lỗi riêng lẻ do từ chối tạo ra
Uncaught DOMException: Node.appendChild: May not add a Document as a child
35Xử lý lỗi trong Promise. cuộc đua
Phương thức tĩnh
Uncaught DOMException: Node.appendChild: May not add a Document as a child
011 chấp nhận một mảng PromiseUncaught DOMException: Node.appendChild: May not add a Document as a child
36Kết quả Promise đầu tiên là người chiến thắng trong "cuộc đua"
Làm thế nào về từ chối sau đó?
Uncaught DOMException: Node.appendChild: May not add a Document as a child
37Thay vào đó, nếu từ chối xuất hiện dưới dạng phần tử đầu tiên của mảng, thì
Uncaught DOMException: Node.appendChild: May not add a Document as a child
011 từ chối và chúng ta phải nắm bắt được từ chốiUncaught DOMException: Node.appendChild: May not add a Document as a child
38Xử lý lỗi trong Promise. Tất cả đều ổn định
Uncaught DOMException: Node.appendChild: May not add a Document as a child
014 là một bổ sung ECMAScript 2020 cho ngôn ngữKhông có quá nhiều thứ để xử lý với phương thức tĩnh này vì kết quả sẽ luôn là một Lời hứa đã được giải quyết, ngay cả khi một hoặc nhiều Lời hứa đầu vào bị từ chối
Xem xét ví dụ sau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
39Chúng tôi chuyển đến
Uncaught DOMException: Node.appendChild: May not add a Document as a child
014 một mảng bao gồm hai Lời hứa. một giải quyết và một từ chối khácTrong trường hợp này,
const err = Error["Something bad happened!"];
28 sẽ không bao giờ bị đánh. const err = Error["Something bad happened!"];
29 thay vì chạyKết quả của mã này, đăng nhập vào
const err = Error["Something bad happened!"];
75 làUncaught DOMException: Node.appendChild: May not add a Document as a child
50Xử lý lỗi cho async/await
const err = Error["Something bad happened!"];
61 trong JavaScript biểu thị các hàm không đồng bộ, nhưng từ quan điểm của người đọc, chúng được hưởng lợi từ tất cả khả năng đọc của các hàm đồng bộĐể đơn giản, chúng ta sẽ sử dụng hàm đồng bộ trước đó là
const err = Error["Something bad happened!"];
22 và chuyển đổi nó thành hàm không đồng bộ bằng cách đặt const err = Error["Something bad happened!"];
12 trước từ khóa const err = Error["Something bad happened!"];
33Uncaught DOMException: Node.appendChild: May not add a Document as a child
51Chỉ bằng cách thêm tiền tố vào một hàm với
const err = Error["Something bad happened!"];
12, chúng ta sẽ khiến hàm trả về một Lời hứa. Điều đó có nghĩa là chúng ta có thể xâu chuỗi const err = Error["Something bad happened!"];
75, const err = Error["Something bad happened!"];
28 và const err = Error["Something bad happened!"];
29 sau khi gọi hàmUncaught DOMException: Node.appendChild: May not add a Document as a child
52Khi chúng ta ném từ hàm
const err = Error["Something bad happened!"];
12, ngoại lệ sẽ trở thành nguyên nhân từ chối đối với Lời hứa cơ bảnBất kỳ lỗi nào cũng có thể bị chặn bằng
const err = Error["Something bad happened!"];
28 từ bên ngoàiQuan trọng nhất, ngoài phong cách này, chúng ta có thể sử dụng
const err = Error["Something bad happened!"];
26, giống như cách chúng ta làm với hàm đồng bộTrong ví dụ sau, chúng ta gọi hàm
const err = Error["Something bad happened!"];
22 từ một hàm khác, Uncaught DOMException: Node.appendChild: May not add a Document as a child
031, hàm này kết thúc lời gọi hàm một cách thuận tiện bằng const err = Error["Something bad happened!"];
26Uncaught DOMException: Node.appendChild: May not add a Document as a child
53đầu ra là
Uncaught DOMException: Node.appendChild: May not add a Document as a child
54Cùng chủ đề. Làm cách nào để loại bỏ lỗi từ các hàm không đồng bộ trong JavaScript?
Xử lý lỗi cho trình tạo không đồng bộ
Trình tạo không đồng bộ trong JavaScript là các hàm tạo có khả năng mang lại Lời hứa thay vì các giá trị đơn giản
Họ kết hợp các hàm tạo với
const err = Error["Something bad happened!"];
12. Kết quả là một hàm trình tạo có các đối tượng trình vòng lặp hiển thị Lời hứa cho người tiêu dùngĐể tạo một trình tạo không đồng bộ, chúng tôi khai báo một hàm tạo với dấu sao
const err = Error["Something bad happened!"];
32, có tiền tố là const err = Error["Something bad happened!"];
12Uncaught DOMException: Node.appendChild: May not add a Document as a child
55Dựa trên Promise, các quy tắc xử lý lỗi tương tự được áp dụng tại đây.
const err = Error["Something bad happened!"];
19 bên trong trình tạo không đồng bộ gây ra từ chối Promise mà chúng tôi chặn bằng const err = Error["Something bad happened!"];
28Để rút Promise ra khỏi trình tạo không đồng bộ, chúng ta có thể sử dụng hai cách tiếp cận
- Trình xử lý
75const err = Error["Something bad happened!"];
- lặp lại không đồng bộ
Từ ví dụ trên, chúng tôi biết chắc chắn sẽ có một ngoại lệ sau hai
const err = Error["Something bad happened!"];
34 đầu tiên. Điều này có nghĩa là chúng ta có thể làmUncaught DOMException: Node.appendChild: May not add a Document as a child
56Đầu ra từ mã này là
Uncaught DOMException: Node.appendChild: May not add a Document as a child
57Cách tiếp cận khác sử dụng phép lặp không đồng bộ với
Uncaught DOMException: Node.appendChild: May not add a Document as a child
040. Để sử dụng phép lặp không đồng bộ, chúng ta cần bao bọc người tiêu dùng bằng hàm const err = Error["Something bad happened!"];
12Đây là ví dụ hoàn chỉnh
Uncaught DOMException: Node.appendChild: May not add a Document as a child
58Và như với
const err = Error["Something bad happened!"];
61, chúng tôi xử lý bất kỳ ngoại lệ tiềm ẩn nào với const err = Error["Something bad happened!"];
41Uncaught DOMException: Node.appendChild: May not add a Document as a child
59Đầu ra của mã này là
Uncaught DOMException: Node.appendChild: May not add a Document as a child
10Đối tượng iterator được trả về từ hàm tạo không đồng bộ cũng có phương thức
const err = Error["Something bad happened!"];
40, giống như đối tượng đồng bộ của nóGọi
const err = Error["Something bad happened!"];
40 trên đối tượng iterator ở đây sẽ không đưa ra ngoại lệ, nhưng từ chối PromiseUncaught DOMException: Node.appendChild: May not add a Document as a child
11Để xử lý tình huống này từ bên ngoài chúng ta có thể làm
Uncaught DOMException: Node.appendChild: May not add a Document as a child
12Nhưng đừng quên rằng các đối tượng trình vòng lặp
const err = Error["Something bad happened!"];
40 gửi ngoại lệ bên trong trình tạo. Điều này có nghĩa là chúng ta cũng có thể áp dụng mẫu sauUncaught DOMException: Node.appendChild: May not add a Document as a child
13Xử lý lỗi trong Node. js
Xử lý lỗi đồng bộ trong Node. js
Xử lý lỗi đồng bộ trong Node. js không khác quá nhiều so với những gì chúng ta đã thấy cho đến nay
Đối với mã đồng bộ,
const err = Error["Something bad happened!"];
26 hoạt động tốtTuy nhiên, mọi thứ trở nên thú vị nếu chúng ta lướt qua thế giới không đồng bộ
Xử lý lỗi không đồng bộ trong Node. js. mô hình gọi lại
Đối với mã không đồng bộ, Nút. js phụ thuộc rất nhiều vào hai thành ngữ
- mô hình gọi lại
- bộ phát sự kiện
Trong mẫu gọi lại, Nút không đồng bộ. js API chấp nhận một chức năng được xử lý thông qua vòng lặp sự kiện và được thực thi ngay khi ngăn xếp cuộc gọi trống
Hãy xem xét đoạn mã sau
Uncaught DOMException: Node.appendChild: May not add a Document as a child
14Nếu chúng tôi trích xuất cuộc gọi lại từ danh sách này, chúng tôi có thể thấy cách xử lý lỗi
Uncaught DOMException: Node.appendChild: May not add a Document as a child
15Nếu có bất kỳ lỗi nào phát sinh từ việc đọc đường dẫn đã cho với
Uncaught DOMException: Node.appendChild: May not add a Document as a child
048, chúng tôi sẽ nhận được một đối tượng lỗiTại thời điểm này chúng ta có thể
- chỉ cần đăng nhập đối tượng lỗi như chúng tôi đã làm
- ném một ngoại lệ
- chuyển lỗi cho một cuộc gọi lại khác
Để ném một ngoại lệ chúng ta có thể làm
Uncaught DOMException: Node.appendChild: May not add a Document as a child
16Tuy nhiên, cũng giống như các sự kiện và bộ hẹn giờ trong DOM, ngoại lệ này sẽ làm hỏng chương trình. Nỗ lực sau đây để ngăn chặn nó bằng
const err = Error["Something bad happened!"];
41 sẽ không hiệu quảUncaught DOMException: Node.appendChild: May not add a Document as a child
17Chuyển lỗi cho một cuộc gọi lại khác là tùy chọn ưu tiên, nếu chúng tôi không muốn làm hỏng chương trình
Uncaught DOMException: Node.appendChild: May not add a Document as a child
18Đây là tên gọi của
Uncaught DOMException: Node.appendChild: May not add a Document as a child
050, một chức năng đơn giản để xử lý lỗiUncaught DOMException: Node.appendChild: May not add a Document as a child
19Xử lý lỗi không đồng bộ trong Node. js. bộ phát sự kiện
Phần lớn những gì bạn làm trong Node. js dựa trên các sự kiện. Hầu hết các lần bạn tương tác với một đối tượng phát và một số người quan sát đang nghe tin nhắn
Bất kỳ mô-đun hướng sự kiện nào [ví dụ như mạng] trong Nút. js mở rộng một lớp gốc có tên là
Uncaught DOMException: Node.appendChild: May not add a Document as a child
051Uncaught DOMException: Node.appendChild: May not add a Document as a child
051 trong nút. js có hai phương thức cơ bản. Uncaught DOMException: Node.appendChild: May not add a Document as a child
053 và Uncaught DOMException: Node.appendChild: May not add a Document as a child
054Hãy xem xét máy chủ HTTP đơn giản này
Uncaught DOMException: Node.appendChild: May not add a Document as a child
0Ở đây chúng tôi lắng nghe hai sự kiện. lắng nghe và kết nối
Ngoài các sự kiện này, trình phát sự kiện cũng hiển thị một sự kiện lỗi, được kích hoạt trong trường hợp có lỗi
Nếu bạn chạy mã này nghe trên cổng 80 thay vì ví dụ trước, bạn sẽ nhận được một ngoại lệ
Uncaught DOMException: Node.appendChild: May not add a Document as a child
1đầu ra
Uncaught DOMException: Node.appendChild: May not add a Document as a child
2Để bắt nó, chúng ta có thể đăng ký một trình xử lý sự kiện cho lỗi
Uncaught DOMException: Node.appendChild: May not add a Document as a child
3Điều này sẽ in
Uncaught DOMException: Node.appendChild: May not add a Document as a child
4Ngoài ra, chương trình sẽ không bị sập
Để tìm hiểu thêm về chủ đề này, hãy cân nhắc đọc thêm "Xử lý lỗi trong Node. js"
kết thúc
Trong hướng dẫn này, chúng tôi đã đề cập đến việc xử lý lỗi trong JavaScript cho toàn bộ phạm vi, từ mã đồng bộ đơn giản đến các nguyên hàm không đồng bộ nâng cao
Có nhiều cách mà một ngoại lệ có thể hiển thị trong các chương trình JavaScript của chúng tôi
Các ngoại lệ từ mã đồng bộ là dễ bắt nhất. Thay vào đó, các ngoại lệ từ các đường dẫn mã không đồng bộ có thể khó xử lý
Trong thời gian chờ đợi, các API JavaScript mới trong trình duyệt hầu hết đều hướng tới
Uncaught DOMException: Node.appendChild: May not add a Document as a child
055. Mẫu phổ biến này giúp xử lý các trường hợp ngoại lệ dễ dàng hơn với const err = Error["Something bad happened!"];
84 hoặc với const err = Error["Something bad happened!"];
41 cho const err = Error["Something bad happened!"];
61Sau khi đọc hướng dẫn này, bạn sẽ có thể nhận ra tất cả các tình huống khác nhau có thể phát sinh trong chương trình của mình và nắm bắt các ngoại lệ một cách chính xác