目次
Node.jsでキャッチされない例外
目次:
1. キャッチされない例外によって引き起こされる問題
2. 怎样处理未捕获异常
3. 一个没有未捕获异常的应用
4. 使你的应用崩溃
5. 假装没看见错误?
6. 应用崩溃,打印日志,然后重启
7. 使用 Domains 模块【译者注:现已废弃】
8. 结论
ホームページ ウェブフロントエンド jsチュートリアル Node.js でキャッチされなかった例外を解決する方法

Node.js でキャッチされなかった例外を解決する方法

Sep 27, 2017 am 10:00 AM
javascript node.js どうやって


Node.jsでキャッチされない例外

Node.jsでキャッチされない例外を処理するのはそれほど簡単ではありません

目次:

  • キャッチされない例外によって引き起こされる問題

  • 対処方法キャッチされなかった例外

  • 捕捉されない例外のないアプリケーション

  • アプリケーションをクラッシュさせます

  • エラーを見て見ぬふりをしていますか?

  • アプリケーションがクラッシュし、ログが出力され、その後再起動します

  • Domains モジュールを使用します [翻訳者注: 現在廃止されています]

  • 結論

1. キャッチされない例外によって引き起こされる問題

ノード .js のシングルスレッドの性質により、キャッチされない例外はアプリケーション開発中に注目に値する問題です。 Node.js は、最初にエラー、次にデータというコールバック パターンに従います。次のような例をよく目にします。コールバック関数がエラー オブジェクトを返すと、エラーはすぐにスローされます。

var fs = require('fs');

fs.readFile('somefile.txt', function (err, data) {
  if (err) throw err;
  console.log(data);
});
ログイン後にコピー

ファイル somefile.txt がない場合にこのプログラムを実行すると、エラーがスローされます。 somefile.txt 这个文件,一个错误将被抛出。

Error: ENOENT, open 'somefile.txt'
ログイン後にコピー

这将导致进程崩溃进而影响到整个APP。
这是有意为之,Node.js 不打算把你的应用和服务分隔开。

2. 怎样处理未捕获异常

处理未捕获异常的最佳方式是什么呢?有非常多方法:

  • 你的应用不应该有未捕获错误,这很疯狂。

  • 你应该让你的应用在崩溃后找到未捕获异常,然后修复它们,这也很疯狂。

  • 对错误视而不见,不处理它—这是大多数人做的,然而这糟透了。

  • 你应该让你的应用在崩溃后打印出错误日志,然后借用 upstart , forever , monit 之类的东西重启进程。这个方法很实用。

  • 【译者注:现已废弃】你应该开始使用 Domains 模块来处理错误,这是必由之路,虽然这还是 Node.js 的一个试验性功能。

现在我们来详细展开这些方法。

3. 一个没有未捕获异常的应用

「没有未捕获异常的应用」这个概念对我来说很怪异,任何应用在某个时刻都会有异常而且可能是未捕获的异常。如果你坚持这个观点并把错误扔给用户,那么我觉得你要做好半夜接到电话被告知服务崩溃掉了的准备。

4. 使你的应用崩溃

The only defence I can find in this opinion is the fail fast argument. You are going to fix your application quickly if it unavailable. If an application without uncaught exceptions is denial letting your application crash is acceptance. But you are still pushing exception handling onto your users.(原谅我实在想不出怎么翻译这段,如果你有好的想法,请尽快联系我!)

5. 假装没看见错误?

很多人这样做:

<p style="margin-bottom: 7px;">process.on(&#39;uncaughtException&#39;, function (err) {<br/>  console.log(err);<br/>})<br/></p>
ログイン後にコピー

这很糟糕,当一个未捕获异常被抛出,你应该意识到你的应用处在一个不正常的状态,这种情况下你无法可靠地运行你的程序。

最初提出 process.on 事件的 Felix Geisendörfer 现在倡议去除它。

6. 应用崩溃,打印日志,然后重启

通过这个方法你可以让你的应用在发生未捕获异常时立即崩溃,然后利用 foreverupstart 这样的工具(几乎可以)立即重启。Node.js 将会把异常写入 STERR 所以你可以把异常重定向到一个日志文件稍晚再通过它拿到错误。这种方法的缺点是,对于错误发生在你的代码之外的 i/o ,不能提供一种优雅的方法来处理临时停电或者网络 i/o 出错的场景。这真是一个利器!— 重启应用并重试。如果你把这种策略与 cluster module 相结合,node 可以自动重启任何抛出错误的 children 并且打印出错误。

var cluster = require(&#39;cluster&#39;);var workers = process.env.WORKERS || require(&#39;os&#39;).cpus().length;if (cluster.isMaster) {
  console.log(&#39;start cluster with %s workers&#39;, workers);  for (var i = 0; i < workers; ++i) {    var worker = cluster.fork().process;
    console.log(&#39;worker %s started.&#39;, worker.pid);
  }
  cluster.on(&#39;exit&#39;, function(worker) {
    console.log(&#39;worker %s died. restart...&#39;, worker.process.pid);
    cluster.fork();
  });
} else {  var http = require(&#39;http&#39;);
  http.createServer(function (req, res) {
    res.end("Look Mum! I&#39;m a server!\n");
  }).listen(3000, "127.0.0.1");
}
process.on(&#39;uncaughtException&#39;, function (err) {
  console.error((new Date).toUTCString() + &#39; uncaughtException:&#39;, err.message)
  console.error(err.stack)
  process.exit(1)
})
ログイン後にコピー

7. 使用 Domains 模块【译者注:现已废弃】

DomainsNode.js v0.8 版本中新增的一个试验性特性,它使得异常处理变得更加灵活和精确。下面是刚才那个文件不存在的例子,通过使用 domains

var domain = require(&#39;domain&#39;);var d = domain.create();var fs = require(&#39;fs&#39;);
d.on(&#39;error&#39;, function(err) {
  console.error(err);
});
d.run(function() {
  fs.readFile(&#39;somefile.txt&#39;, function (err, data) {
    if (err) throw err;
    console.log(data);
  });
});
ログイン後にコピー
ログイン後にコピー

これにより、プロセスがクラッシュし、アプリ全体に影響を与えます。 🎜これは意図的なものであり、Node.js はアプリケーションとサービスを分離するつもりはありません。 🎜🎜2. キャッチされない例外を処理する方法🎜🎜 キャッチされない例外を処理する最良の方法は何ですか?方法はたくさんあります: 🎜🎜🎜🎜 アプリに捕捉されないエラーがあってはなりません、それはクレイジーです。 🎜🎜🎜🎜 クラッシュ後にアプリにキャッチされなかった例外を見つけさせて修正させるべきですが、それもクレイジーです。 🎜🎜🎜🎜間違いに目をつぶって対処しない – これはほとんどの人がやっていることですが、最悪です。 🎜🎜🎜🎜クラッシュ後にアプリケーションにエラー ログを出力させてから、 upstartforevermonit などを借用して、プロセスを再起動する必要があります。 。この方法は非常に実用的です。 🎜🎜🎜🎜【翻訳者注: 現在は廃止されています】エラーを処理するには Domains モジュールを使用し始める必要がありますが、これはまだ Node.js の実験的な機能です。 🎜🎜🎜🎜それでは、これらの方法を詳しく見ていきましょう。 🎜🎜3. キャッチされない例外のないアプリケーション🎜🎜 「キャッチされない例外のないアプリケーション」という概念は、私にとっては奇妙です。どのアプリケーションでも、ある時点で例外が発生し、それがキャッチされない例外になる可能性があります。この点を主張してユーザーにエラーを投げるなら、夜中に電話がかかってきてサービスが落ちたと言われることは覚悟すべきだと思います。 🎜🎜4. アプリケーションをクラッシュさせる🎜🎜 この意見で私が見つけることができる唯一の防御策は、アプリケーションが利用できない場合は、アプリケーションをクラッシュさせることを受け入れることです。 . しかし、あなたは依然として例外処理をユーザーに押し付けています (この段落の翻訳方法が分からないことをお詫びします。良いアイデアがある場合は、できるだけ早く連絡してください!) 🎜🎜5.エラーが見えますか? 🎜🎜多くの人がこれを行います: 🎜rrreee🎜これは良くありません。キャッチされない例外がスローされたときは、アプリケーションが異常な状態にあることを認識する必要があります。その場合、プログラムを確実に実行することはできません。 🎜🎜Felix Geisendörfer は、最初に process.on イベントを提案しましたが、現在はその削除を主張しています。 🎜🎜6. アプリケーションがクラッシュし、ログが出力され、その後再起動します🎜🎜この方法を使用すると、キャッチされない例外が発生したときにアプリケーションをすぐにクラッシュさせ、その後、forever または upstart< を使用できます。 /code > このようなツールは (ほぼ) 瞬時に再起動できます。 Node.js は例外を <code>STERR に書き込むため、例外をログ ファイルにリダイレクトして、後でそこからエラーを取得できます。このアプローチの欠点は、コードの外で発生する一時的な停電やネットワーク i/o エラーを処理する適切な方法が提供されないことです。問題が発生するシナリオです。なんてツールなんだ! — アプリを再起動して、もう一度試してください。この戦略を cluster module と組み合わせると、ノードはエラーをスローした子を自動的に再起動し、エラーを出力できます。 🎜rrreee🎜7. Domains モジュールを使用します [翻訳者注: 現在廃止されました]🎜🎜DomainsNode.js v0.8 バージョンにあります例外処理をより柔軟かつ正確にする新しい実験的機能が追加されました。以下は、ファイルが存在しない場合の例です。domains を使用すると、特定のドメインに対してエラー イベントをトリガーできます。また、さまざまなシナリオに応じてさまざまな例外処理を使用することもできます。これにより、例外が発生した場所に応じて例外を処理できます。プロセスを終了することがハンマーでナットを割ることに似ているとすれば、これはプログラムを完全に制御できる精密なメスのようなものです。 🎜
var domain = require(&#39;domain&#39;);var d = domain.create();var fs = require(&#39;fs&#39;);
d.on(&#39;error&#39;, function(err) {
  console.error(err);
});
d.run(function() {
  fs.readFile(&#39;somefile.txt&#39;, function (err, data) {
    if (err) throw err;
    console.log(data);
  });
});
ログイン後にコピー
ログイン後にコピー

8. 结论

如果你在产品环境运行 Node.js 你起码应该对如何处理异常有一个想法。目前为止我相信当异常被抛出时,大多数人只是重启应用(也许是优雅地重启),Domains 为应用提供了一种更聪明的面对异常的能力,异常处理器可能会选择简单的清理、关闭某些连接,最坏的情况下,退出进程。关键点就在于你有了选择。

我抛下榔头拾起手术刀的时候应该已经到了

以上がNode.js でキャッチされなかった例外を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GIGABYTE マザーボードでキーボード ブート機能を設定する方法 (GIGABYTE マザーボードでキーボード ブート モードを有効にする) GIGABYTE マザーボードでキーボード ブート機能を設定する方法 (GIGABYTE マザーボードでキーボード ブート モードを有効にする) Dec 31, 2023 pm 05:15 PM

Gigabyte のマザーボードでキーボード起動を設定する方法 まず、キーボード起動をサポートする必要がある場合は、PS2 キーボードである必要があります。 !設定手順は次のとおりです: ステップ 1: 起動後に Del または F2 を押して BIOS に入り、BIOS の Advanced (Advanced) モードに移動します 通常のマザーボードは、デフォルトでマザーボードの EZ (Easy) モードに入ります。 F7 を押してアドバンスト モードに切り替える必要があります。ROG シリーズ マザーボードはデフォルトで BIOS に入ります。アドバンスト モード (説明には簡体字中国語を使用します) ステップ 2: - [アドバンスト] - [アドバンスト パワー マネージメント (APM)] を選択します。 ステップ 3 : オプション [PS2 キーボードによるウェイクアップ] を見つけます ステップ 4: このオプション デフォルトは無効です プルダウンすると、3 つの異なる設定オプションが表示されます: [スペースバー] を押してコンピューターの電源をオンにし、グループを押します

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

Shenzhou Xuanlong m7e8s3 で独立したグラフィックス カードの直接接続を有効にする方法は? Shenzhou Xuanlong m7e8s3 で独立したグラフィックス カードの直接接続を有効にする方法は? Jan 04, 2024 am 09:24 AM

Shenzhou Xuanlong m7 の独立したグラフィックス カードの直接接続を有効にする方法. Shenzhou Xuanlong m7 の独立したグラフィックス カードの直接接続機能を有効にするには、次の手順に従います。独立したグラフィックカードのドライバーをインストールしました。神州の公式 Web サイトまたは独立系グラフィック カード メーカーの公式 Web サイトにアクセスして、グラフィック カード モデルに適した最新のドライバーをダウンロードしてインストールできます。 2. コンピュータのデスクトップで、空白スペースを右クリックし、ポップアップ メニューで [NVIDIA コントロール パネル] を選択します (AMD グラフィック カードの場合は、[AMDRadeon 設定] を選択します)。 3. コントロール パネルで、「3D 設定」または同様の名前のオプションを見つけ、クリックして入力します。 4. [3D 設定] で、[グローバル設定] または同様の名前のオプションを見つける必要があります。ここで、一意の使用を指定できます

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

ナイキシューズの靴箱の本物と偽物の見分け方(簡単に見分けるコツをマスター) ナイキシューズの靴箱の本物と偽物の見分け方(簡単に見分けるコツをマスター) Sep 02, 2024 pm 04:11 PM

世界的に有名なスポーツブランドとして、ナイキのシューズは大きな注目を集めています。しかし、市場にはナイキの偽物の靴箱などの偽造品も多数出回っています。消費者の権利と利益を保護するには、本物の靴箱と偽物の靴箱を区別することが重要です。この記事では、本物の靴箱と偽物の靴箱を見分けるための簡単で効果的な方法をいくつか紹介します。 1: 外箱のタイトル ナイキの靴箱の外箱を観察すると、多くの微妙な違いを見つけることができます。ナイキの純正靴箱は通常、手触りが滑らかで、明らかな刺激臭のない高品質の紙素材を使用しています。本物の靴箱のフォントとロゴは通常、鮮明で詳細で、ぼやけや色の不一致はありません。 2: ロゴのホットスタンプのタイトル。ナイキの靴箱のロゴは通常、純正の靴箱のホットスタンプ部分に表示されます。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

CF を再生するときの Savior y7000p の解像度はどれくらいですか (Savior y7000 で CF を再生するときに全画面を調整する方法) CF を再生するときの Savior y7000p の解像度はどれくらいですか (Savior y7000 で CF を再生するときに全画面を調整する方法) Jan 07, 2024 am 10:13 AM

CF 再生時の Savior Y7000P の解像度はどれくらいですか? CF 再生時の Savior Y7000P の解像度は 1920*1080 です。このコンピューターには GTX1650 グラフィックス カードと i5-9300H プロセッサーが搭載されているため、そのパフォーマンスは比較的良好で、CF などのゲームのニーズを満たすのに十分です。同時に、1920*1080は現在の主流のeスポーツモニターの解像度であり、画質と鮮明さは十分です。また、より高い要件を持つプレイヤーがいる場合は、ゲームの画質設定を適切に下げることで、よりスムーズなゲーム体験を得ることができます。より鮮明な視覚体験を楽しむために、Savior y7000p の解像度を 2560*1400 に調整できます。より高画質な映像表示をお楽しみいただけます。 Savior Y7000P 2022年モデルを搭載

See all articles