Restifyを使用していて、Restifyライブラリのどこかで、ユーザー側の入力が不正であるため例外がスローされています。私は問題を再現する以下の簡単なコードを持っています。以下の例の問題は、非同期関数で、doesntexist.nofunctionを実行しようとしています。何が起こるかは、 "server.on( 'uncaughtException .."関数で捕捉された例外ですが、 "err"オブジェクトは実際には "IncomingMessage"タイプであり、 "Error"タイプではありません。これについて。throwされたJavaScript例外のタイプが「エラー」
1)例外は常にタイプ「エラー」であることとされていない場合、 これはRestifyのバグです?スローすべき
2)にも エラーがあるかどう「ERR」パラメータを設定するコールバックパラメータに取り、そしてライブラリが投げるとは対照的に、クライアントが コールバックでそれを処理させるライブラリのベストプラクティスことです例外?
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