2011-11-26 89 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! 
} 

而且裏面do_stuff,我有:node.js如何避免我的錯誤?

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

爲什麼它從來沒有原木 '抓到錯誤'?相反,它打印堆棧跟蹤和錯誤對象屏幕:

{ 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) 

注意到,如果我把扔的權利的do_stuff(之後),那麼它會抓住它。

即使我把它嵌入到另一個函數中,我怎樣才能讓它抓住?

+1

什麼是'insert_data( 'ABC'){拋出新的錯誤( '哈哈')}'應該是什麼?這不是有效的語法。你的代碼真的是什麼樣子? – RightSaidFred

+0

@RightSaidFred謝謝,修正。 – TIMEX

+0

@TIMEX你不能捕獲異步環境的錯誤,它不會這樣工作。停止使用'try catch' – Raynos

回答

6

這是使用NodeJS的缺點之一。它基本上有兩種處理錯誤的方法;一個通過使用try/catch塊,另一個通過傳遞每個回調函數的第一個參數作爲錯誤。

問題是因爲事件循環異步模型。您可以使用'uncaughtException'事件來捕獲未捕獲的錯誤,但它已成爲Node.JS中常用的程序範例,使用回調函數的第一個參數來顯示是否有任何錯誤,如下所示:從未使用過的MySQL與之前的NodeJS,只是做一般性的例子)

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

這不是使用node.js的缺點之一。這是優點之一,你可以殺死try catch並使用'(err,data)'回調 – Raynos

+0

@Raynos我不明白爲什麼這是件好事?嘗試捕捉是處理不可預見情況的consise成語......有一個參數在大多數情況下都是空的,似乎令人費解,並且像設計氣味! –

+3

@DanielUpton嘗試捕捉是醜陋的,它很慢,不會異步工作,並完全崩潰你的應用程序 – Raynos