2015-12-10 15 views
6

Tôi đang sử dụng spawn để sinh ra một quy trình chạy dài gửi đầu ra theo thời gian tới stdio, và được đọc và xử lý bởi tập lệnh nodejs của tôi. Phần khó khăn là tôi không thể đảm bảo rằng lệnh được gửi sẽ luôn hợp lệ. Làm thế nào tôi có thể bắt lỗi trong sinh sản? Tốt hơn là điều này sẽ không liên quan đến việc cài đặt một trình xử lý ngoại lệ toàn cục, vì tôi không muốn xử lý bất kỳ ngoại lệ nào khác. (Nếu đó là cách duy nhất, tôi sẽ cần phải tìm ra khi quá trình sinh sản đã bắt đầu một cách chính xác và sau đó gỡ cài đặt trình xử lý, đó là một mớ hỗn độn mà tôi không muốn tham gia.)Làm thế nào để bắt ENOENT với nodejs child_process.spawn?

Mã tôi muốn chạy sẽ là một cái gì đó như thế này:

var spawn = require('child_process').spawn; 

try { 
    spawn("zargle"); 
} catch (e) { 
    console.error("I'm handling the error!"); 
} 

Nhưng điều này chỉ đặt ra một uncaughtException đâu đó trong vòng lặp sự kiện nút, có lẽ vì cuộc gọi là async và thậm chí không cố gắng để bắt đầu quá trình trẻ em trên lát thời gian kịch bản của tôi.

Trường hợp ngoại lệ duy nhất cần được ghi lại là khi sinh sản không bắt đầu quá trình (ví dụ: tên không chính xác và ENOENT được ném). Tôi không (tại thời điểm này) liên quan đến bất kỳ vấn đề nào mà quá trình sinh sản có thể tự tạo ra.


tương tự nhưng khác nhau: How do I debug "Error: spawn ENOENT" on node.js?

Tôi biết chính xác lý do tại sao tôi nhận được ENOENT, và tôi biết những gì để thay đổi có lỗi không xảy ra. Câu hỏi của tôi là làm thế nào để trả lời một cách duyên dáng tình huống này nếu lỗi là không thể tránh khỏi.

Trả lời

15

Giống như nhiều thứ trong nút, quá trình con có thể phát ra một số error event. Thêm một người nghe cho điều đó và bạn sẽ có thể bắt được nó (không cần try-catch):

var spawn = require('child_process').spawn; 
var child = spawn('foo'); 
child.on('error', function(err) { 
    console.log('Oh noez, teh errurz: ' + err); 
}); 
+0

Vì vậy, bạn hoàn toàn đúng. Tôi thậm chí không bao giờ cố gắng điều này bởi vì nó đã không xảy ra với tôi rằng đẻ trứng sẽ chọn lọc ném một ngoại lệ hoặc không phụ thuộc vào việc một trình xử lý lỗi đã được đính kèm. (Nó sẽ là tốt đẹp nếu các tài liệu sẽ đề cập đến những thứ như thế này để giúp chúng tôi nút mới.) – Fizzbuzz97

+1

FWIW 'lỗi' sự kiện luôn luôn là một sự kiện đặc biệt ở chỗ nếu không có trình nghe sự kiện' lỗi' (và không có 'uncaughtException' xử lý sự kiện trên 'process') khi nó được phát ra, lỗi sẽ được ném. Có một phần chuyên biệt về lỗi [ở đây] (https://nodejs.org/docs/latest/api/errors.html) trong tài liệu nút. – mscdex

+0

Tôi chỉ thử điều này nhưng nó không hoạt động. Điều này có hiệu quả nếu spawn cố chạy một tệp không tồn tại? – Janneman

1

Bạn có thể cố gắng bắt nó với sự kiện uncaughtException event. Nhưng tôi tin rằng phần còn lại của nhiệm vụ sẽ không dễ dàng.

process.on('uncaughtException', function (err) { 
    console.log(err); 
}); 
1

Giống như mscdex nói, bạn phải đính kèm các sự kiện 'lỗi', tuy nhiên, bạn nên thêm cố gắng nắm bắt bởi vì một số sai sót, như EPERM không cháy, sự kiện lỗi và ném Lỗi ngoại lệ.

var spawn = require('child_process').spawn; 
try{ 
    var child = spawn('foo'); 
    child.on('error', function(err) { 
     console.log('Oh noez, teh errurz: ' + err); 
    }); 
}catch(err){ 
    console.log("exception: "+err) 
} 
+1

Bạn có thể cung cấp một ví dụ về ý của bạn không? Câu trả lời của bạn có vẻ mơ hồ và tôi không biết liệu tôi có nên điều tra thêm điều này hay không. –

+0

Tôi đồng ý, không rõ ràng, tôi đã cập nhật câu trả lời của mình, hy vọng nó rõ ràng hơn. –

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