2017-02-08 49 views
1

我正在使用Restify和Restify庫中的某處,由於用戶端的一些錯誤輸入而拋出異常。我在下面有一些簡化的代碼,重現了這個問題。下面示例中的問題是嘗試執行doesntexist.nofunction的異步函數。會發生什麼情況是引發了一個異常,然後捕獲到「server.on('uncaughtException ..」函數,但「err」對象實際上是「IncomingMessage」類型,而不是「Error」類型。關於這個,拋出的JavaScript異常不屬於「錯誤」類型

1)拋出的異常總是類型爲「錯誤」,如果不是,則爲 這是Restify中的一個錯誤?

2)是否有針對採取了還要設置 一個「錯誤」的參數,如果有一個錯誤回調參數,並讓客戶端處理它在 回調,而不是庫拋出庫最佳實踐例外?

var restify = require('restify'); 

//Test with long stack traces and without it. 
//var longStackTraces = require('long-stack-traces'); 

const server = restify.createServer({ 
    name: 'myapp', 
    version: '1.0.0' 
}); 

server.get('/', function (req, res, next) { 
    try { 
     setTimeout(function() { 
      doesntexist.nofunction(); 
     }, 200); 

     return next(); 
    } catch (err) { 
     console.log("Caught error"); 
    } 
}); 

server.on('uncaughtException', function (err) { 
    console.log("uncaught exception1: " + err.constructor); 
}); 

process.on('uncaughtException', function (err) { 
    console.log("uncaught exception2: " + err.constructor); 
}); 

server.listen(9123, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

測試:

curl http://localhost:9123 

不長的棧跟蹤控制檯輸出:

myapp listening at http://[::]:9123 
uncaught exception1: function IncomingMessage(socket) { 
    Stream.Readable.call(this) 
... 
Error: uncaught exception1 
    at Server.<anonymous> (/usr/apps/myapp/Temp.js:22:12) 
    at emitMany (events.js:132:20) 
    at Server.emit (events.js:201:7) 
    at Domain.onError (/usr/apps/myapp/node_modules/restify/lib/server.js:968:18) 
    at emitOne (events.js:96:13) 
    at Domain.emit (events.js:188:7) 
    at Domain._errorHandler (domain.js:97:23) 
    at process._fatalException (bootstrap_node.js:293:33) 

控制檯輸出而不長棧跟蹤:

+0

你基本上可以拋出任何東西,但它*應該*有一個消息和一個堆棧跟蹤。你應該例如不要拋出原始值。 – Bergi

回答

1
  • 節點式回調函數應該有一個sig自然與err作爲第一個參數。這不是任何規範,而是社區規範。
  • 你的代碼是這樣的:

    server.get('/', function (req, res, next) { 
        try { 
         setTimeout(function() { 
          doesntexist.nofunction(); 
         }, 200); 
    
         return next(); 
        } catch (err) { 
         console.log("Caught error"); 
        } 
    }); 
    

    我會改寫這樣的:

    server.get('/', function (req, res, next) { 
        setTimeout(function() { 
         try { 
          doesntexist.nofunction(); 
          next(); 
         } catch (err) { 
          next(err); 
         } 
        }, 200); 
    }); 
    

    next是一個節點式的回調與err作爲第一個參數,因爲是傳統。通過在需要時提供參數err來利用它。

    +0

    您能否提供聲明沒有達成共識的來源? – Bergi

    +0

    我知道「沒有證據不是缺席的證據」的謬誤。我刪除了我的說法。 –

    +0

    @Joe,應該「err」始終是對象類型「錯誤」? – user994165

    相關問題