用Javascript写入抛出的错误到一个文件

有没有办法在JavaScript中添加一个默认行为到throw事件。 就像我试图添加到一个文件,每当一个错误被抛出:

例如:

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

我想先写入文件,然后抛出错误。 我知道我可以添加一个函数,只是在抛出之前,我可以调用该函数,但只是为了知道更多的是有什么想添加一个默认行为与抛出?

错误是不同于JavaScript的NodeJS的例外。 错误是Error类的任何实例。 错误可能会被构造,然后直接传递给另一个函数或抛出。 当你抛出一个错误时,它就成为一个exception。下面是一个使用错误作为exception的例子:

 throw new Error('something bad happened'); 

但你也可以创build一个错误而不会抛出它:

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

由于您在评论中提到您不想在应用程序的所有文件中要求error handling程序文件。 您也可以使用NodeJS EventEmitter模块或使用error handling中间件

我认为你最好的select是使用自定义投掷。 我其实总是这样做,能够写作

 _throw("MyErrorMessage") 

所以我会做这样的事情:

 //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') 

您可以创build自己的自定义错误,并在构造函数中执行一些逻辑。

 function MyError(){ //do some logic herer (eg write to file) console.log("some logic"); } throw new MyError() 

如果您正在使用NodeJS应用程序,则可以集中pipe理所有抛出的错误。

你也应该说出你的错误:

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

同样使用其他名称的其他错误types。

对于快速申请,

 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}); } }); 

注意,如果你从一个Promise,async / await中抛出,这将不会捕获你的错误。 您将不得不以其他方式集中捕获它们,可能是通过捕获应用程序中的所有未处理的承诺拒绝

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

同样,你也应该集中捕获所有未捕获的exception

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

build议:就文件logging错误而言,只有在通过其他方式parsing文件,将文件发送到logstash等情况下,才能做到这一点。

如果您不打算以编程方式parsing文件,请将错误logging在errordb / error-table中。 他们更容易查询这种方式:)