nodejs最有魅力的地方就是異步編程,但異步情況下異常處理起來就比較麻煩了。
// 同步方法var sync = function(){ throw new Error("出錯了!!!")}// 異步方法var async = function(callback){ // do something PRocess.nextTick(function(){ throw new Error("出錯了!!!") callback() })}同步方法異常處理是沒有問題的:
try { sync()}catch(err){ console.log(err.message) // 出錯了!!!}異步方法這種方式是捕獲不到的
try { async()}catch(err){ console.log(err.message) // 不會打印內容}方法1: 遵守nodejs潛規則,將異常從回調函數中以第一個參數傳遞出來
// 異步方法var async = function(callback){ // do something process.nextTick(function(){ var err = new Error("出錯了!!!"); callback(err) })}async(function(err){ if(err){ console.log(err.message); }else{ // do something }})方法2: process對象提供了捕獲全局異常的方法
// 異步方法var async = function(callback){ // do something process.nextTick(function(){ throw new Error("出錯了!!!") callback() })}process.on("uncaughtException", function(err){ console.log(err.message) // 出錯了!!!})這種方法缺點在于它在進程退出時才處理異常,我們往往需要盡早執行
方法三: 使用domain模塊創建一個子域(JS子運行環境)
var domain = require('domain').create();domain.on("error", function(err){ console.log(err.message);})domain.run(function(){ async()})新聞熱點
疑難解答