2016-09-23 26 views
6

của họ đã là một câu hỏi về chủ đề nàyNode.js thực hành tốt nhất Xử lý ngoại lệ - Sau Async/chờ đợi

Node.js Best Practice Exception Handling

đó là cũ và câu trả lời là rất nhiều lỗi thời, domains thậm chí còn phản đối kể từ đó.

Hiện tại trong trường hợp Async/Await Node.js không nên xem xét đồng bộ hóa và các trường hợp không đồng bộ tương tự và ném ngoại lệ trong các chức năng đồng bộ và từ chối lời hứa trong các chức năng async thay vì trả về cá thể Error trong trường hợp cũ.

let divideSync = function(x,y) { 
    // if error condition? 
    if (y === 0) { 
     // "throw" the error 
     throw new Error("Can't divide by zero exception") 
    } 
    else { 
     // no error occured, continue on 
     return x/y 
    } 
} 

Mô phỏng async hoạt động chia

let divideAsync = function(x, y) { 

    return new Promise(function(resolve, reject) { 

    setTimeout(function() { 
     // if error condition? 
     if (y === 0) { 
     // "throw" the error safely by rejecting the promise 
     reject (new Error("Can't divide by zero exception")); 
     } else { 
     // no error occured, continue on 
     resolve(x/y) 
     } 
    }, 1000); 
    }) 

}; 

Vì vậy, đồng bộ hóa và ngoại lệ async thể được xử lý một cách thống nhất

let main = async function() { 
    try { 
     //const resultSync = divideSync(4,0); 
     const resultAsync = await divideAsync(4,0); 
    } 
    catch(ex) { 
     console.log(ex.message); 
    } 

} 

Trả lời

8

Những câu trả lời từ Node.js Best Practice Exception Handling là cũ và rất nhiều lỗi thời

Không nhiều. This answer, với danh sách từ this well-maintained blog post, đã được cập nhật.
The offical node.js guide luôn đọc tốt và cách tiếp cận chung không thay đổi nhiều.

Vậy điều gì đã thay đổi?

  • Tên miền bị hỏng và không dùng nữa. Vâng, đó là tin cũ.
  • Các "callbacks kiểu nút" điển hình với thông số lỗi đầu tiên của chúng, được kích hoạt chính xác một lần, không nên sử dụng nữa. Kiểu mã hóa không đồng bộ tuần tự đơn giản này với tất cả các vấn đề của nó đã được siêu nhận bởi lời hứa và async/await. (Lưu ý: phát thải kiện vv là một trường hợp khác nhau)
  • process.on('uncaughtException') được bổ sung bởi process.on('unhandledRejection')
  • lời hứa cũng bắt lỗi lập trình viên nếu được sử dụng một cách chính xác. Đối với mã không đồng bộ tuần tự nhàm chán, chúng có thể thay thế tên miền.

Vậy điều này có ý nghĩa gì đối với mã phổ biến?

Chúng tôi có nên xem xét các trường hợp đồng bộ hóa và không đồng bộ tương tự và ném ngoại lệ trong các chức năng đồng bộ hóa và từ chối lời hứa trong các chức năng không đồng bộ thay vì trả về phiên bản Error không?

Có, chính xác. Bạn nên từ chối lời hứa của mình với Error s (hoặc throw chúng từ async function s).

Lưu ý rằng bạn hiếm khi phải tự gọi số reject. Với lời hứa, bạn sẽ có thể throw trong mã của mình. Nếu bạn không thể, bạn có thể không sử dụng chúng một cách chính xác - và lỗi lập trình sẽ không bị bắt ở đó.

Quy tắc vàng cho mã này là: Không bao giờ sử dụng gọi lại không phải là lời gọi lại lời hứa. "Lời gọi lại hứa hẹn" đề cập đến các đối số new Promise, thencatch và có thể một số phương pháp tùy chỉnh của thư viện của bạn (ví dụ: finally). Đây là nơi mã ví dụ của bạn ở trên có sự cố. Viết một cách chính xác, nó nên đọc

async function divideAsync(x, y) { 
    await new Promise(resolve => 
     setTimeout(resolve, 1000) // don't even pass a function expression 
    ); 
    if (y === 0) { 
     throw new Error("Can't divide by zero exception"); 
    } else { 
     return x/y; 
    } 
} 
+0

Vì vậy, như một quy luật, nếu một chức năng không đồng bộ sử dụng async sau đó ném lỗi và nếu không thì từ chối lỗi –

+0

Không, ngay cả khi một chức năng không sử dụng 'cú pháp async', nhưng sử dụng lời hứa, bạn có thể và nên 'throw' (hoặc' return Promise.reject (…) 'nếu bạn thích) từ lời gọi lại lời hứa, như' divideAsync = (x, y) => new Promise (r => setTimeout (r, 1000)). Sau đó (() => {if (y === 0) ném lỗi mới (…) khác trở lại x/y}) ' – Bergi

+1

Tại sao ngoại lệ không bị bắt (không được xử lý) nếu tôi ném lỗi trong phiên bản của mình của mã –

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