2013-05-23 22 views
7

Tôi đang cố gắng để bắt chồng dấu vết của một uncaughtException Node.js và nó hoạt động tốt cho các lỗi khác nhau nhưng không cho ném() báo cáo:Thiếu stack trace trên Node.js uncaughtException tạo ra bởi ném()

đúng stack trace về xử lý ngoại lệ:

$ cat errorFunc.js 
process.on('uncaughtException', function(exception) { 
    console.log('uncaughtException occurred: ' + exception.stack); 
}); 
MyError(); 

$ node errorFunc.js 
    uncaughtException occurred: ReferenceError: MyError is not defined 
    at Object.<anonymous> (/home/jolcese/code/WebEnclaves/Server/errorFunc.js:5:1) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 
$ 

Thiếu stack trace trên ngoại lệ do ném():

$ cat errorThrow.js 
process.on('uncaughtException', function(exception) { 
    console.log('uncaughtException occurred: ' + exception.stack); 
}); 
throw('my error'); 

$ node errorThrow.js 
uncaughtException occurred: undefined 
$ 

Bất cứ ý tưởng tại sao?

Cảm ơn Jose

Disclaimer: Tôi biết rằng việc sử dụng process.on ('uncaughtException') là một điều rất, rất tồi tệ và tôi sẽ bị trừng phạt nhưng sử dụng lĩnh vực không phải là một lựa chọn trong mã này.

Trả lời

7

JavaScript cho phép bạn ném bất kỳ thứ gì.

Nếu bạn muốn ném lỗi với dấu vết ngăn xếp trong JavaScript, bạn cần phải ném các đối tượng Error. (specification)

Ngoài ra, ném là toán tử chứ không phải hàm.

Hãy thử

throw new Error('my error'); 

Xem the manual trên Developer Network Mozilla cho biết thêm thông tin.

+0

Nếu bạn muốn tôi xây dựng cách thức và lý do tại sao điều này được thực hiện ở cấp độ máy ảo (trong v8), hãy cho tôi biết. Tôi thấy rằng nó không liên quan để giải quyết vấn đề của bạn. –

+0

Cảm ơn Benjamin vì câu trả lời !. Bạn có biết lý do tại sao hành vi này lại khác bên trong một Web Worker? Một cú ném; tuyên bố bên trong một cuộc gọi Web Worker (nếu được đăng ký) gọi lại onerror cung cấp mô tả, lineno, colno, v.v. – JoseOlcese

+0

@JoseOlcese Vâng, câu trả lời đơn giản nhất là vì đó là cách chúng được thiết kế. WebNhững người làm việc là một phần của nút tiêu chuẩn web không tuân thủ. Nó chỉ là WebWorkers là hữu ích. Nói chung, bạn nên luôn luôn ném các đối tượng Lỗi và không phải công cụ khác khi bạn quan tâm đến việc gỡ lỗi (luôn phải có lỗi) –

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