Lỗi ném javascript với mã trạng thái

Nút. xử lý lỗi js không phải là một cuộc dạo chơi trong công viên. Khi triển khai các ứng dụng vào sản xuất, chúng tôi muốn biết rằng tất cả mã đã được kiểm tra cho tất cả các tình huống phức tạp có thể xảy ra

Tuy nhiên, chúng ta có thể tránh các sự cố bằng cách chuẩn bị mã của mình để xử lý lỗi đúng cách. Để làm được như vậy, chúng ta cần phải hiểu

  • Đối tượng lỗi
  • Cố gắng bắt
  • Phi
  • ngăn xếp cuộc gọi
  • Đặt tên hàm hiệu quả
  • Các mô hình không đồng bộ như lời hứa

Hôm nay, chúng tôi sẽ đưa bạn qua các mục trên và cung cấp cho bạn một chuyến tham quan về những điều kỳ quặc chính của JavaScript để hiểu rõ hơn và hiểu rõ hơn. Sau đó, chúng ta sẽ thảo luận về các phương pháp hay nhất và các trở ngại phổ biến mà các nhà phát triển thường gặp phải khi xử lý Node. xử lý lỗi js

Vì vậy, hay thực hiện ngay bây giơ

Mẹo. Tìm lỗi ứng dụng và các vấn đề về hiệu suất ngay lập tức với Stackify Retrace

Khắc phục sự cố và tối ưu hóa mã của bạn thật dễ dàng với các lỗi tích hợp, nhật ký và thông tin chi tiết về hiệu suất cấp mã

Nút. Xử lý lỗi JS. Quan tâm làm gì?

Trước tiên hãy giải quyết câu hỏi lớn. tại sao phải bận tâm xử lý lỗi?

Hãy tưởng tượng bạn đang sử dụng Node. js để xây dựng API web RESTful. Bạn có người dùng đang gửi yêu cầu dữ liệu từ máy chủ của bạn. Tất cả đều tốt cho đến nay, phải không?

Hãy xem một ví dụ. Hãy tưởng tượng bạn đang sử dụng Node. js để xây dựng API web RESTful. Bạn có người dùng đang gửi yêu cầu dữ liệu từ máy chủ của bạn. Tất cả đều tốt cho đến nay, phải không?

Với bất kỳ ai trên thế giới ném yêu cầu vào chương trình của chúng tôi, vấn đề chỉ là thời gian trước khi các giá trị xâm nhập vào chương trình của chúng tôi mà chúng tôi không mong đợi. Và khi chúng tôi nhận được những giá trị này, việc phản hồi hiệu quả cho người dùng của chúng tôi có nghĩa là mô tả lỗi một cách rõ ràng nhất có thể. Nếu chúng ta không có Node thích hợp. js, có khả năng chúng tôi sẽ đưa ra một thông báo lỗi chung. Vì vậy, người dùng sẽ thấy thông báo lỗi “Không thể hoàn thành yêu cầu. ”

Điều này không hữu ích lắm

Hơn nữa, không chỉ trải nghiệm người dùng quyết định lý do tại sao chúng ta nên hiểu biết về Node của mình. xử lý lỗi js. Nếu chúng tôi muốn chương trình của mình an toàn, linh hoạt, hiệu suất cao và không có lỗi, Node. xử lý lỗi js là phải

đối tượng lỗi

Điều đầu tiên cần biết về Node. xử lý lỗi js là đối tượng lỗi

Bạn có thể đã thấy một số mã giống như thế này

throw new Error['database failed to connect'];

Điều đó nghe có vẻ khá áp đảo

Để đơn giản, hãy chia nhỏ nó ra. Hai điều khác biệt đang xảy ra ở đây. đối tượng lỗi đang được tạo và đang bị ném. Hãy bắt đầu bằng cách xem xét đối tượng lỗi và cách thức hoạt động của nó và quay lại từ khóa ném sau một chút

Mặc dù có vẻ ngoài đáng sợ, các đối tượng lỗi khá đơn giản. Đối tượng lỗi là một triển khai của hàm tạo sử dụng một tập hợp các hướng dẫn [chính đối số và phần thân của hàm tạo] để tạo đối tượng. Đó là nó. Trình tạo lỗi tích hợp chỉ đơn giản là một cách thống nhất để tạo một đối tượng lỗi

Các đối tượng lỗi là gì?

Đây là những câu hỏi quan trọng, vì vậy hãy đến với chúng

Giải phẫu của một đối tượng lỗi

Đối số đầu tiên cho một đối tượng lỗi gốc là mô tả của nó. Mô tả là chuỗi đối tượng lỗi của bạn mà con người có thể đọc được. Đó là những gì bật lên trong bảng điều khiển của bạn khi có điều gì đó không ổn

Thứ hai, các đối tượng lỗi cũng có thuộc tính tên, là phần mà máy tính có thể đọc được của đối tượng. Khi bạn sử dụng đối tượng lỗi gốc, thuộc tính tên mặc định là "Lỗi" chung. ” Tuy nhiên, bạn cũng có thể tự tạo. Cách tốt nhất để làm điều này là mở rộng đối tượng lỗi gốc như vậy

class FancyError extends Error {
    constructor[args]{
        super[args];
        this.name = "FancyError"
    }
}

console.log[new Error['A standard error']]
// { [Error: A standard error] }

console.log[new FancyError['An augmented error']]
// { [Your fancy error: An augmented error] name: 'FancyError' }

Chúng tôi đã đề cập trước đó rằng chúng tôi muốn các đối tượng lỗi của mình đồng nhất. Đó là bởi vì khi chúng ta ném lỗi, sẽ giúp có sự nhất quán trong đối tượng bị ném. Nếu chúng ta có sự nhất quán trong các đối tượng của mình, việc xử lý lỗi sẽ dễ dàng hơn [sẽ nói thêm về điều này sau]

Bây giờ hãy thảo luận về cú ném, mảnh ghép tiếp theo của chúng ta

Uh-oh, một lỗi - ném nó

Tạo một đối tượng lỗi không phải là kết thúc của câu chuyện và chỉ ẩn dụ về lỗi của chúng tôi để gửi. Cách chúng tôi nhấn gửi khi gặp lỗi là ném. Nhưng nó có nghĩa là gì để ném?

Ném thực sự làm hai điều. nó dừng chương trình và nó tìm thấy một cú bắt để thực hiện. Hãy xem xét từng ý tưởng một

Khi JavaScript tìm thấy một từ khóa ném, điều đầu tiên nó làm là ngừng hoạt động. Sự kiện này ngăn bất kỳ chức năng nào khác chạy. Bằng cách dừng như vậy, nó giảm thiểu nguy cơ xảy ra lỗi tiếp theo và giúp gỡ lỗi chương trình dễ dàng

Khi chương trình tạm dừng, JavaScript sẽ bắt đầu theo dõi chuỗi các hàm được gọi để đạt được câu lệnh bắt. Chuỗi này được gọi là ngăn xếp cuộc gọi [đừng lo lắng - chúng ta sẽ sớm đến ngăn xếp cuộc gọi]. Điểm gần nhất mà JavaScript tìm thấy là nơi xuất hiện ngoại lệ được ném. Nếu không tìm thấy thử/bắt, ngoại lệ sẽ ném và Nút. js thoát, khiến máy chủ khởi động lại

Ném bằng ví dụ

Cho đến nay, chúng tôi đã khá lý thuyết. Hãy xem xét một ví dụ

function doAthing[] {
    byDoingSomethingElse[];
}

function byDoingSomethingElse[] {
    throw new Error['Uh oh!'];
}

function init[] {
    try {
        doAthing[];
    } catch[e] {
        console.log[e];
        // [Error: Uh oh!]
    }
}

init[];

Ở đây chúng ta có thể thấy rằng hàm init đã xử lý lỗi try/catch tại chỗ. Nó gọi một chức năng, gọi một chức năng khác, do đó sẽ gây ra lỗi. Đó là điểm xảy ra lỗi khi chương trình tạm dừng và bắt đầu truy tìm chức năng gây ra lỗi. Cuối cùng, nó quay lại hàm init và thực thi câu lệnh catch. Trong câu lệnh catch, chúng ta có thể quyết định thực hiện một hành động, loại bỏ lỗi hoặc thậm chí đưa ra một lỗi khác [để lan truyền lên trên]

ngăn xếp cuộc gọi

Những gì chúng ta đang thấy trong ví dụ trên là một ví dụ hoạt động của ngăn xếp cuộc gọi. Để hoạt động [giống như hầu hết các ngôn ngữ], JavaScript sử dụng một khái niệm được gọi là ngăn xếp cuộc gọi. Nhưng làm thế nào để ngăn xếp cuộc gọi hoạt động?

Bất cứ khi nào một chức năng được gọi, nó sẽ được đưa vào ngăn xếp; . Chính từ ngăn xếp này mà chúng tôi lấy tên là “dấu vết ngăn xếp”, mà bạn có thể đã nghe nói đến. Đây là những thông báo lớn, trông đáng sợ mà đôi khi chúng ta thấy khi có lỗi trong chương trình của chúng ta

Họ thường trông như thế này

Error: Uh oh!
at byDoingSomethingElse [/filesystem/aProgram.js:7:11]
at doAthing [/filesystem/aProgram.js:3:5]
at init [/filesystem/aProgram.js:12:9]
at Object. [/filesystem/aProgram.js:19:1]
at Module._compile [internal/modules/cjs/loader.js:689:30]
at Object.Module._extensions..js [internal/modules/cjs/loader.js:700:10]
at Module.load [internal/modules/cjs/loader.js:599:32]
at tryModuleLoad [internal/modules/cjs/loader.js:538:12]
at Function.Module._load [internal/modules/cjs/loader.js:530:3]
at Function.Module.runMain [internal/modules/cjs/loader.js:742:12]

Tại thời điểm này, bạn có thể tự hỏi làm thế nào một ngăn xếp cuộc gọi giúp chúng tôi với Node. xử lý lỗi js. Hãy nói về tầm quan trọng của ngăn xếp cuộc gọi

Ngăn xếp cuộc gọi của bạn cung cấp breadcrumbs của bạn, giúp bạn theo dõi lại cách mà bạn đã đến. Ngăn xếp cuộc gọi cũng cho phép bạn theo dõi nguồn gốc của lỗi để bạn có thể dễ dàng xem chức năng nào đã được gọi. Ngoài ra, nó giúp theo dõi thời điểm xảy ra lỗi

Nhưng chờ đã, có một số sắc thái đối với tất cả những thứ ngăn xếp cuộc gọi này

Trường hợp này có nhiều lông là chủ đề của các chức năng ẩn danh hoặc các chức năng không có tên. Bạn hỏi, tại sao chúng ta có các chức năng không có tên? . Chúng tôi không muốn tự mình làm việc với nhiệm vụ đặt tên cho chúng, nhưng chính những chức năng ẩn danh này có thể khiến chúng tôi đau đầu. Một hàm ẩn danh xóa tên hàm khỏi ngăn xếp cuộc gọi của chúng tôi, điều này làm cho ngăn xếp cuộc gọi của chúng tôi khó sử dụng hơn đáng kể

Lưu ý rằng việc đặt tên hàm trong JavaScript không đơn giản như vậy. Vì vậy, hãy xem nhanh các cách khác nhau mà bạn có thể định nghĩa hàm và giải quyết một số lỗi trong cách đặt tên hàm

Cách đặt tên hàm

Để hiểu cách đặt tên hàm, hãy xem xét một số ví dụ

// Anonymous function
const one = [] => {};

// Anonymous functions
const two = function [] {};

// Explicitly named function
const three = function explicitFunction[] {};

Ở đây chúng tôi có ba hàm ví dụ

Đầu tiên là lambda [đôi khi được gọi là hàm mũi tên béo]. Các chức năng Lambda được ẩn danh bởi đức hạnh. Đừng nhầm lẫn. Tên biến “một” không phải là tên hàm. Tên chức năng được tùy ý chuyển sau từ khóa “hàm. ” Nhưng trong ví dụ này, chúng tôi không chuyển bất cứ thứ gì cả, vì vậy chức năng của chúng tôi là ẩn danh

Ghi chú. Việc một số thời gian chạy JavaScript, chẳng hạn như V8, đôi khi có thể đoán tên hàm của bạn không giúp ích được gì. Điều này xảy ra ngay cả khi bạn không cung cấp cho nó một. Nhưng không lạc đề quá nhiều, bạn không muốn dựa vào chức năng này vì nó không nhất quán

Thứ hai, chúng ta có một biểu thức hàm. Điều này rất giống với lần đầu tiên. Đó là một hàm ẩn danh, nhưng được định nghĩa đơn giản bằng từ khóa hàm thay vì cú pháp mũi tên béo

Cuối cùng, chúng ta có một khai báo biến với tên apt. chức năng rõ ràng. Nó cho thấy rằng chức năng duy nhất được đặt tên phù hợp là khi bạn sử dụng từ khóa chức năng và chuyển tên [tùy chọn]. Nói chung, cách tốt nhất là cung cấp tên này bất cứ nơi nào bạn có thể để có dấu vết ngăn xếp dễ đọc hơn

Xử lý lỗi không đồng bộ [gọi lại]

Tại thời điểm này, bạn là người đam mê đối tượng lỗi, ném từ khóa, ngăn xếp cuộc gọi và đặt tên hàm. Vì vậy, chúng ta hãy chú ý đến trường hợp tò mò xử lý lỗi không đồng bộ. Tại sao? . lập trình viên js

Trước khi chúng ta tìm hiểu quá sâu, hãy đánh giá cách JavaScript xử lý các tác vụ không đồng bộ và tại sao chúng ta thậm chí cần phải làm điều này

JavaScript là một ngôn ngữ lập trình đơn luồng, trong tiếng Anh đơn giản, có nghĩa là JavaScript chạy bằng một bộ xử lý duy nhất. Nhờ có một bộ xử lý duy nhất, chúng tôi nhận được mã chặn hoặc ngược lại, mã không chặn. Mã chặn đề cập đến việc liệu chương trình của bạn có đợi một tác vụ không đồng bộ hoàn tất trước khi thực hiện bất kỳ điều gì khác hay không. Trong khi mã không chặn đề cập đến nơi bạn đăng ký gọi lại để thực hiện khi tác vụ hoàn thành

Về cơ bản, điều đáng nói là có hai cách chính bạn có thể xử lý không đồng bộ trong JavaScript. lời hứa hoặc gọi lại. Chúng tôi đang cố tình bỏ qua async/wait ở đây để tránh nhầm lẫn vì nó chỉ đơn giản là lời hứa

Với mục đích của bài viết này, chúng tôi sẽ tập trung vào những lời hứa. Có sự đồng thuận đáng kể trong ngành rằng đối với viết mã ứng dụng, hứa hẹn sẽ đánh bại các cuộc gọi lại về phong cách lập trình và hiệu quả. Vì vậy, đối với bài viết này, chúng tôi sẽ bỏ qua mẫu gọi lại và cho rằng thay vào đó bạn sẽ chọn lời hứa. Một lựa chọn tốt, chúng tôi có thể thêm

Ghi chú. Thật may mắn cho bạn, có nhiều cách để chuyển đổi mã dựa trên lệnh gọi lại của bạn thành lời hứa. Ví dụ: bạn có thể sử dụng một tiện ích như promisify tích hợp sẵn hoặc gói các cuộc gọi lại của bạn trong các lời hứa như vậy

var request = require['request']; //http wrapped module
function requestWrapper[url, callback] {
    request.get[url, function [err, response] {
        if [err] {
            callback[err];
        } else {
            callback[null, response];
        }
    }]
}

Chúng tôi sẽ xử lý lỗi này, tôi hứa

Được rồi, vì vậy chúng tôi đã nhân đôi lời hứa. Nhưng điều này có ý nghĩa gì đối với Node của chúng tôi. xử lý lỗi js?

Chúng ta hãy xem giải phẫu của một lời hứa

Một lời hứa trong JavaScript là một đối tượng đại diện cho một giá trị trong tương lai. Lời hứa cho phép chúng tôi lập mô hình mã không đồng bộ giống như mã đồng bộ bằng cách sử dụng API Hứa hẹn [chúng ta sẽ xem sau]. Cũng cần lưu ý rằng một lời hứa thường đi theo một chuỗi, trong đó một hành động được thực hiện, sau đó là một hành động khác, v.v.

Nhưng tất cả điều này có ý nghĩa gì đối với Node. xử lý lỗi js?

Các lời hứa xử lý lỗi khá tinh tế và sẽ bắt bất kỳ lỗi nào xảy ra trước nó trong chuỗi. Điều này thật tuyệt vời cho Node. js vì chúng tôi có thể xử lý nhiều lỗi trong nhiều chức năng trong một trình xử lý duy nhất. Hãy xem đoạn mã dưới đây

function getData[] {
    return Promise.resolve['Do some stuff'];
}

function changeDataFormat[]{
    // ...
}

function storeData[]{
    // ...
}

getData[]
    .then[changeDataFormat]
    .then[storeData]
    .catch[[e] => {
        // Handle the error!
    }]

Ở đây chúng tôi thấy cách bạn có thể tổng hợp xử lý lỗi của mình cho cả ba chức năng khác nhau thành một. Về cơ bản, điều này hoạt động như thể nó bao hàm tất cả các chức năng của bạn trong một lần thử/bắt đồng bộ

Bắt hay không bắt lời hứa?

Tại thời điểm này, bạn có thể tự hỏi liệu việc thêm lời hứa vào lời hứa của mình có phải là tùy chọn hay không. Có, đó là tùy chọn, nhưng bạn phải luôn cung cấp trình xử lý bắt

Tại sao? . Mã của chúng tôi có thể hết thời gian chờ, có thể có sự cố mạng hoặc có thể có lỗi phần cứng. Vì tất cả những lý do này, bạn phải luôn hướng dẫn chương trình của mình phải làm gì trong trường hợp thất bại trong lời hứa.

Hãy nhớ nguyên tắc vàng. luôn xử lý từ chối lời hứa

Sự nguy hiểm của thử/bắt không đồng bộ

Bây giờ chúng ta sắp kết thúc hành trình của mình thông qua Node. xử lý lỗi js. Nhưng đây là thời điểm thích hợp để xác định một cạm bẫy khá lớn của mã không đồng bộ và câu lệnh try/catch

Bạn có thể đã tự hỏi tại sao lời hứa lại hiển thị một phương thức bắt và tại sao chúng ta không thể thực hiện lời hứa của mình trong một lần thử/bắt. Nếu bạn làm điều này, kết quả sẽ không như bạn mong đợi

Hãy lấy một ví dụ

try {
    throw new Error[];
} catch[e] {
    console.log[e]; // [Error]
}

try {
    setTimeout[[] => {
        throw new Error[];
    }, 0];
} catch[e] {
    console.log[e]; // Nothing, nada, zero, zilch, not even a sound
}

Cho mà một cái nhìn tốt. Bạn có thấy điều gì đang xảy ra ở đây không?

Thử/bắt theo mặc định là đồng bộ. Điều đó có nghĩa là nếu một hàm không đồng bộ gây ra lỗi trong khối thử/bắt đồng bộ, thì không có lỗi nào xảy ra

Đó chắc chắn không phải là những gì chúng tôi muốn

Tóm lại, nếu bạn đang xử lý việc xử lý lỗi không đồng bộ, bạn thực sự nên sử dụng trình xử lý bắt lời hứa, điều này sẽ cho phép bạn xử lý các lỗi không đồng bộ một cách hiệu quả. Nhưng nếu bạn đang xử lý mã đồng bộ, thử/bắt sẽ hoạt động tốt

Xử lý lỗi với dụng cụ

Nếu ném một ngoại lệ, nhưng không có lập trình viên nào nhìn thấy nó, liệu nó có bị ném không?

— Châm ngôn lập trình Phật giáo Zen cổ đại

Chúng tôi có một số tin tốt và một số tin xấu. Nếu bạn đang xử lý lỗi tốt nhất có thể trong ứng dụng của mình, thật tuyệt vời. Đó là tin tốt. Tin xấu là bạn mới chỉ đi được nửa chặng đường

Xử lý lỗi trong chương trình của bạn chỉ giải quyết những điều bạn biết về. Chúng ta có thể viết mã hoàn hảo bao nhiêu thì lỗi vẫn xảy ra. Thay vì cố gắng ngăn chặn tất cả các lỗi xảy ra, chúng ta nên cố gắng biết khi nào lỗi xảy ra. Chúng ta cũng nên thu thập nhiều thông tin nhất có thể về vấn đề

Và đó là lúc một công cụ giám sát hiệu suất ứng dụng phát huy tác dụng. APM có đủ hình dạng và kích cỡ khác nhau. Một số phân tích dữ liệu nhật ký hoặc cơ sở hạ tầng của bạn; . Khi xử lý lỗi, nên sử dụng APM để hiển thị ứng dụng của bạn. Chẳng ích gì khi dành toàn bộ thời gian để tối ưu hóa dấu vết ngăn xếp, tên hàm và những thứ tương tự nếu tất cả dữ liệu phong phú này được ném vào một số tệp nhật ký trên một máy chủ hoang vắng

Bằng cách sử dụng một APM chẳng hạn như Retrace, bạn có thể hiểu rõ hơn về cách chương trình của bạn đang hoạt động. Bạn cũng có thể xem các truy vấn cơ sở dữ liệu của mình thực thi như thế nào, tải trên máy chủ của bạn, v.v. Tất cả điều này có thể giúp bạn cải thiện đáng kể tốc độ gỡ lỗi và thời gian khắc phục

Truy xuất thu thập rất nhiều dữ liệu theo ngữ cảnh về những gì đang xảy ra khi xảy ra lỗi. Dữ liệu này có thể rất hữu ích cho mục đích báo cáo lỗi. Bạn có thể nhận danh sách khách hàng hoặc người dùng của mình bị ảnh hưởng bởi lỗi, cho phép bạn xem mọi dấu vết ngăn xếp, URL hoặc tên phương thức duy nhất bị ảnh hưởng bởi lỗi. Tải xuống bản dùng thử miễn phí hai tuần của Retrace ngay hôm nay

Nút. Xử lý lỗi JS và tự tin vận chuyển

Và đó là tất cả những gì chúng ta có cho ngày hôm nay. Chúng tôi hy vọng đó là phần giới thiệu hữu ích về xử lý lỗi trong Node. js. Tại thời điểm này, bạn sẽ cảm thấy thoải mái hơn với ý tưởng loại bỏ các đối tượng lỗi và bắt chúng bằng mã đồng bộ hoặc không đồng bộ. Các ứng dụng của bạn sẽ mạnh mẽ hơn đáng kể và sẵn sàng cho sản xuất

Bạn cũng có thể muốn dùng thử Prefix, trình lược tả mã theo thời gian thực, miễn phí của Stackify để viết mã tốt hơn trên máy trạm của bạn. Tiền tố hoạt động với. NET, Java, PHP, Nút. js, Ruby và Python

Làm cách nào để ném lỗi JavaScript?

Ném một ngoại lệ chung gần như đơn giản như nó có vẻ. Tất cả những gì cần làm là khởi tạo một đối tượng ngoại lệ—với tham số đầu tiên của hàm tạo Lỗi là thông báo lỗi—và sau đó… "ném" nó .

Làm cách nào để ném lỗi 404 trong JavaScript?

use[function[req, res, next] { var err = new Error['Not Found']; err. status = 404;

Làm cách nào để đưa ra lỗi 500 trong JavaScript?

Lỗi thường được lan truyền thông qua tham số đầu tiên của lệnh gọi lại được cung cấp. Nếu tôi cần trả lại lỗi cho người dùng, tôi sẽ thực hiện bằng cách sử dụng res. gửi['Lỗi', 500];

Điều gì xảy ra khi JavaScript đưa ra lỗi?

Khi xảy ra lỗi, JavaScript thường sẽ dừng và tạo thông báo lỗi . Thuật ngữ kỹ thuật cho điều này là. JavaScript sẽ đưa ra một ngoại lệ [ném một lỗi]. JavaScript sẽ thực sự tạo một đối tượng Lỗi có hai thuộc tính. tên và tin nhắn.

Chủ Đề