Node.jsの戦闘52:キャプチャ「キャッチされない例外」間違いました。

ほぼすべてのクラッシュのプログラム、原因ノード「キャッチされない例外。」

「キャッチされない例外」が表示された場合、ノードは、実行のプロセスを終了するためにデフォルト設定されます。

:ファクトprocess.onに()メソッドは、次のようなプロセスレベルの例外を捕捉することができます

var http = require("http");
var server = http.createServer(function(req,res){
    response.end("Hello JShaman.com");
});
server.listen(8000);

process.on("uncaughtException",function(err){
    console.error(err.message,err.stack);
})

実行は、ブラウザでアクセスを開始し、文句を言うでしょう。

しかし、プログラムはエラーはなかったです。

如果不使用process.on()捕获这个异常,那么:

var http = require("http");
var server = http.createServer(function(req,res){
    response.end("Hello JShaman.com");
});
server.listen(8000);

エラーが発生したときに明らかに、プログラムが終了します。

ただし、()process.onとキャプチャ、およびプログラムは本当に大丈夫、終了しないのですか?

答えは:良いではありません!

なぜ?

そうすることでリソースリーク、メモリリークが発生します。

参考文献:

このエラーが発生すると、他の言葉では、プログラムは崩壊にバインドされています。

彼はまもなく終了後にメモリの枯渇やその他の理由で、その結果、ためにもリソース・リークのため、すぐに終了しませんでした。

正しいアプローチは、次のとおりです。

var http = require("http");
var server = http.createServer(function(req,res){
    response.end("Hello JShaman.com");
});
server.listen(8000);

process.on("uncaughtException",function(err){
    console.error(err.message,err.stack);

    server.close();
    setTimeout(process.exit(),3000);
})

すなわち:処理プロセス、および終了します。

そして再び、それは問題で、デバッグの自然の原因を見つけ、問題を解決することです。

方法?どのようにデバッグしますか?

「ドメイン」を使用します。

var http = require("http");
var domain = require("domain");

var d = domain.create();
d.run(function(){
    var server = http.createServer(function(req,res){

        d.on("error",function(er){
            res.statusCode = 500;
            res.end("internal server error");
            server.close();
            setTimeout(process.exit(),3000,1);
        })

        response.end("Hello JShaman.com");
    });

    server.listen(8000);
    
});

ドメインを使用して、サンドボックスで髪コードの実行を行うことができます、あなたはより良いコードの一部を監視することができます。私たちがどのコードの一部に問題があると思われる場合は、問題を発見し、問題を解決する私たちを助けるために、当然のことながら、クライアントにエラーメッセージを監視するために出力することができるログを、この方法を使用することができます。

公開された54元の記事 ウォンの賞賛1 ビュー617

おすすめ

転載: blog.csdn.net/w2sft/article/details/104036800