2012-03-05 60 views
6

Cách tốt nhất trong nút để xử lý các yêu cầu không được giải quyết sắp ra khỏi mã nút lõi là gì? Tôi có một quá trình nền chạy và thu thập nội dung web và sẽ chạy trong một thời gian dài mà không có vấn đề, nhưng thường thì một ngoại lệ không mong muốn xảy ra và tôi dường như không thể xử lý nó một cách duyên dáng. Thủ phạm thông thường dường như là một số vấn đề mạng (mất kết nối), nơi mà các cuộc gọi http tôi đang thực hiện thất bại. Tất cả các chức năng mà tôi đã tạo theo mẫu FUNCTION_NAME (error, return_data), nhưng trong các tình huống xảy ra lỗi, tôi không thấy bất kỳ chức năng nào tôi đã tạo trong ngăn xếp cuộc gọi được in ra, thay vào đó hiển thị một số mô đun nút lõi. Tôi không thực sự lo lắng về những lỗi không thường xuyên và nguyên nhân gốc rễ của họ, mục đích của bài đăng này chỉ là cố gắng tìm một cách duyên dáng để xử lý các trường hợp ngoại lệ này.Xử lý ngoại lệ nút

Tôi đã thử đặt thử/nắm bắt ở cấp cao nhất của mã nơi mọi thứ đều chạy dưới nhưng dường như không có các ngoại lệ này. Thực hành tốt trong nút có sử dụng try/catch trong tất cả các hàm mức thấp hơn sử dụng bất kỳ mã lõi nào không? Hay có cách nào đó để nắm bắt toàn bộ tất cả các ngoại lệ chưa được giải quyết?

Cảm ơn

Chris

CẬP NHẬT ĐẾN ADD STACK

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: connect Unknown system errno 10060 
    at errnoException (net.js:642:11) 
    at Object.afterConnect [as oncomplete] (net.js:633:18) 
+0

Bạn có thể sao chép ngăn xếp của một số ngăn xếp ngoại lệ không bắt buộc này không? – seppo0010

+0

Tôi vừa thêm bản in ngăn xếp vào câu hỏi chính từ một trong các lỗi gần đây. Nó gây nhầm lẫn cho tôi vì nó không hiển thị bất kỳ mã nào của tôi bên trong nó. –

+0

Bạn đang sử dụng phiên bản nút nào? Tôi hỏi vì số dòng không khớp với bản sao cục bộ của tôi. – seppo0010

Trả lời

4

là có một số cách để trên toàn cầu chụp tất cả các trường hợp ngoại lệ unhandled?

Bạn có thể bắt tất cả ngoại lệ bằng cách sử dụng process.on ('uncaughtException'). Lắng nghe sự kiện này sẽ tránh hành động mặc định khi in ngăn xếp và thoát. Tuy nhiên, hãy lưu ý rằng bỏ qua các ngoại lệ có thể dẫn đến các sự cố trong quá trình thực thi ứng dụng của bạn.

Link: http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

Chú ý đến những lời khuyên tài liệu:

Lưu ý rằng uncaughtException là một cơ chế rất thô để xử lý ngoại lệ. Sử dụng try/catch trong chương trình của bạn sẽ cho bạn nhiều quyền kiểm soát hơn đối với luồng chương trình của bạn. Đặc biệt là cho các chương trình máy chủ được thiết kế để chạy mãi mãi, uncaughtException có thể là một cơ chế an toàn hữu ích.

1

Để bắt lỗi mạng và tránh hành vi mặc định (in ngăn xếp và thoát) bạn phải nghe các sự kiện "lỗi".

Ví dụ

var net = require('net'); 
var client = net.connect(80, 'invalid.host', function() { 
    console.log("Worked"); 
}) 
client.on('error', console.log); 
0

tôi đã đặt cùng một tập tin nhanh chóng lỗi xử lý mà đăng nhập và email cho tôi bất cứ khi nào một ngoại lệ unhandled được ném. sau đó (tùy chọn) cố gắng khởi động lại máy chủ.

Check it out!

1

tôi đã viết về vấn đề này thời gian gần đây tại http://snmaynard.com/2012/12/21/node-error-handling/. Một tính năng mới của nút trong phiên bản 0.8 là tên miền và cho phép bạn kết hợp tất cả các hình thức xử lý lỗi thành một biểu mẫu quản lý dễ dàng hơn. Bạn có thể đọc về chúng trong bài viết của tôi và trong docs.

Bạn có thể sử dụng các miền để xử lý các đối số lỗi gọi lại, phát hiện sự kiện lỗi và ngoại lệ tất cả ở cùng một nơi.Vấn đề trong trường hợp cụ thể này là khi bạn không xử lý một bộ phát sinh sự kiện lỗi, nút theo mặc định sẽ in dấu vết ngăn xếp và thoát khỏi ứng dụng.