2017-11-02 7 views
2

javascriptのデフォルト動作をスローイベントに追加する方法はありますか? 私は、エラーがスローされるたびにファイルに追加しようとしています同様:スローされたエラーをJavascriptのファイルに書き込む

例:

if (tables.length === 0) { 
     throw new Error("NO_TABLES_RETRIEVED"); 
    } 

私は最初のファイルと、エラーをスローするように書きたいです。私は関数を追加することができ、投げる直前にその関数を呼び出すことができますが、もっと知るためにはデフォルトの振る舞いをスローで追加するようなものがありますか?

+0

は、あなたがのtry..catchブロックを使用するようになる:私は実際には常にだから私はそのような何かをするだろう

_throw("MyErrorMessage") 

を書くことができるようにするために、それを行いますか? – brk

+0

でもtryキャッチでは、関数を呼び出してファイルに書き込む必要があります。私はスローがどこにあるにせよ、私の機能を実行すべきところがどこにあっても、ノードJSのアプリケーション全体にスローがどこにあるかに関わらず、それを探しています。 – Akshay

+0

あなたはnodejsでそれをしたいですか? –

答えて

1

エラーはJavascript w.r.t NodeJSの例外とは異なります。エラーは、Errorクラスのインスタンスです。エラーを構築してから、別の関数に直接渡すか、スローすることができます。あなたがエラーをスローした場合、それはexception.2なるとここで例外としてエラーを使用しての例です:

throw new Error('something bad happened'); 

あなただけ同様にそれを投げずにエラーを作成することができます。

callback(new Error('something bad happened')); 

コメントの中では、アプリケーションのすべてのファイルにエラーハンドラファイルを必要としたくないと述べています。 NodeJS EventEmitter moduleを使用するか、エラーハンドラミドルウェアを使用することもできます。

+0

このEventEmitterモジュールを試してみます。私はちょうどリンクに記載されている機能を記述するために考えていた。例えば、私はemitter.on(eventName、listener)を使用しています。これはどこにコードを書くべきですか? – Akshay

+0

アプリケーションのどこにでも書くことができます(app.jsまたは別のファイルに自由に書き込むことができます)。あなたが放出したいときはいつも 'eventEmitter.emit( 'eventName'); ' –

+0

お願いします。受諾した回答をupvoteまたはマークすることを忘れないでください。だから、他の人にとっては役に立ちます。 @Akshy –

0

独自のカスタムエラーを作成し、コンストラクタでロジックを実行できます。

function MyError(){ 
 
    //do some logic herer (e.g. write to file) 
 
    console.log("some logic"); 
 
} 
 

 
throw new MyError()

+0

がありますが、この関数を作成するところでは、エラーが発生しているアプリケーションのすべてのファイルでこのファイルが必要になります。私はデフォルトで新しいエラーをスローして遊ぶことができるものはありますか? – Akshay

+0

エラーがウィンドウオブジェクトにあるように、カスタムエラーもウィンドウに表示できます。 もう一つのオプションは、デフォルトのErrorオブジェクトにいくつかの機能を追加し、投げる前にそれを呼び出すことです: Error.prototype.someMethod = function(){console.log( "test")}; – ShacharW

+0

yupsしかし、私が探しているのは、各ファイルに移動してすべてのスローの前に関数にコールを追加したくないというデフォルトの動作を追加することです。これには多くの編集が必要です。 – Akshay

0

あなたはNodeJSアプリケーションを使用している場合は、中央ですべてのあなたのスローエラーを管理することができます。

また、あなたのエラーに名前を付ける必要があります。

class ApiError extends Error { 

    constructor (message, code) { 
    super(message); 
    this.name = 'ApiError'; 
    this.code = code; 
    } 
} 

は、同様に他のエラーの種類の他の名前を使用します。 Expressアプリケーションのために

、あなたが約束の中から投げている場合

app.use(routes); 

// place this after your routes in express app. This will catch all your thrown errors. 
app.use(function (err, req, res, next) { 
    console.log(err); 

    switch (err.name) { 
     case 'ApiError': 
     // write to file here 
     return res.status(err.code || 500).send({error: err.message}); 

     case 'Some other error': 
     // handle differently 
     break; 

     default: 
     res.status(err.status || 500).render('500', {error: err}); 
    } 
}); 

注意、非同期/のawait、これはあなたのエラーをキャッチしません。あなたはまた、すべてのキャッチされない例外をキャッチする必要があり、おそらく

process.on('unhandledRejection', (reason) => { 
    console.log(reason); 
    // log error in file 
}); 

同様にアプリ内のすべての未処理の約束の拒否を引くことで、それらを一元他の方法をキャッチする必要があります一元

process.on('uncaughtException', (err) => { 
    console.log(err); 
    // log error in file 
}); 

提案: ファイルのロギングエラーに関する限り、これはファイルを別の方法で解析してログを出力するなどしてファイルをログ保存した場合にのみ行うことができます。

プログラムでファイルを解析する予定がない場合は、エラーをerrordb/error-tableに記録してください。彼らはそれほど簡単に問い合わせることができます:)

1

私はあなたの最善の策はカスタムスローを使うことです。

//Should use something like dot-env with the path to your errors 
 
require('dotenv').config() 
 

 
//I'm just gonna fake it to make it work on your machine: 
 
process.env.error_file_path = './myErrors.txt' 
 

 

 
//throwLib.js 
 
const util = require('util') 
 
const fs = require('fs') 
 
const writeFile = util.promisify(fs.appendFile) 
 

 
_throw = (stringError) => { 
 
    writeFile(process.env.error_file_path, "Error : " + stringError + "\n").then(err => { 
 
     if (err) 
 
      console.log(err) 
 
     throw new Error(stringError) 
 
    } 
 
    ) 
 
} 
 
//import this in your files. 
 
//myFile.js 
 

 

 
//someStuff 
 
_throw('someMessage1') 
 
_throw('someMessage2') 
 
_throw('someMessage3')

関連する問題