2011-11-26 30 views
7
var api_friends_helper = require('./helper.js'); 
try{ 
    api_friends_helper.do_stuff(function(result){ 
     console.log('success'); 
    }; 
}catch(err){ 
    console.log('caught error'); //this doesn't hit! 
} 

Và bên do_stuff, tôi có:Làm thế nào để node.js không gặp lỗi của tôi?

function do_stuff(){ 
    //If I put the throw here, it will catch it! 
    insert_data('abc',function(){ 
     throw new Error('haha'); 
    }); 
} 

Tại sao nó không bao giờ nhật ký 'bắt lỗi'? Thay vào đó, nó in stack-trace và đối tượng lỗi màn hình:

{ stack: [Getter/Setter], 
    arguments: undefined, 
    type: undefined, 
    message: 'haha' } 
Error: haha 
    at /home/abc/kj/src/api/friends/helper.js:18:23 
    at /home/abc/kj/src/api/friends/db.js:44:13 
    at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11) 
    at Query.emit (events.js:61:17) 
    at Query._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/query.js:51:14) 
    at Client._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/client.js:312:14) 
    at Parser.<anonymous> (native) 
    at Parser.emit (events.js:64:17) 
    at /home/abc/kj/src/node_modules/mysql/lib/parser.js:71:14 
    at Parser.write (/home/abc/kj/src/node_modules/mysql/lib/parser.js:576:7) 

Chú ý rằng nếu tôi đặt QUYỀN ném SAU do_stuff(), sau đó nó sẽ bắt nó.

Làm thế nào tôi có thể bắt nó, ngay cả khi tôi đặt nó lồng vào bên trong một chức năng khác?

+1

'insert_data ('abc') {throw new Error ('haha')}' nghĩa là gì? Đó không phải là cú pháp hợp lệ. Mã của bạn thực sự trông như thế nào? – RightSaidFred

+0

@RightSaidFred cảm ơn, đã khắc phục. – TIMEX

+0

@TIMEX bạn không thể bắt lỗi của môi trường không đồng bộ, nó không hoạt động theo cách đó. Ngừng sử dụng 'try catch' – Raynos

Trả lời

6

Đây là một trong những nhược điểm của việc sử dụng NodeJS. Về cơ bản nó có hai phương pháp mà các lỗi được xử lý; Một thông qua việc sử dụng các khối try/catch, và khác bằng cách chuyển đối số đầu tiên của mọi hàm gọi lại dưới dạng lỗi.

Vấn đề là do mô hình không đồng bộ vòng lặp sự kiện. Bạn có thể sử dụng sự kiện 'uncaughtException' để bắt lỗi không bị bắt, nhưng nó có trở thành một mô hình chương trình thông thường trong Node.JS để sử dụng đối số đầu tiên của hàm gọi lại để hiển thị nếu có bất kỳ lỗi nào, như vậy: (I không bao giờ sử dụng MySQL với NodeJS trước đây, chỉ cần tạo một ví dụ chung)

function getUser(username, callback){ 
    mysql.select("SELECT username from ...", function(err,result){ 
     if(err != null){ 
      callback(err); 
      return; 
     } 

     callback(null, result[0]); 
    }); 
}  

getUser("MyUser", function(err, user){ 
    if(err != null) 
     console.log("Got error! ", err); 
    else 
     console.log("Got user!"); 
}); 
+0

Nó không phải là một trong những nhược điểm của việc sử dụng node.js. Đó là một trong những lợi thế, bạn có thể giết, hãy thử bắt và sử dụng '(err, data)' callbacks – Raynos

+0

@Raynos Tôi không hiểu tại sao đó là một điều tốt? cố gắng bắt là một thành ngữ consise để xử lý các trường hợp không lường trước được ... có một tham số đó sẽ là null hầu hết thời gian có vẻ phức tạp và giống như một mùi thiết kế! –

+3

@DanielUpton cố gắng nắm bắt là xấu xí, nó chậm như địa ngục, không hoạt động không đồng bộ và treo ứng dụng của bạn hoàn toàn – Raynos

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