我正在使用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)
控制檯輸出而不長棧跟蹤:
你基本上可以拋出任何東西,但它*應該*有一個消息和一個堆棧跟蹤。你應該例如不要拋出原始值。 – Bergi