Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中将抛出的错误写入文件_Javascript_Node.js_Error Handling_Throw - Fatal编程技术网

在Javascript中将抛出的错误写入文件

在Javascript中将抛出的错误写入文件,javascript,node.js,error-handling,throw,Javascript,Node.js,Error Handling,Throw,是否有方法将javascript中的默认行为添加到抛出事件中。 就像我试图在抛出错误时添加到文件: 例如: if (tables.length === 0) { throw new Error("NO_TABLES_RETRIEVED"); } 我想先写入文件,然后抛出错误。我知道我可以添加一个函数,在抛出之前我可以调用该函数,但我想知道的是,是否有类似于使用抛出添加默认行为的内容?您可以创建自己的自定义错误,并在构造函数中执行一些逻辑 函数MyError(){ //在

是否有方法将javascript中的默认行为添加到抛出事件中。 就像我试图在抛出错误时添加到文件:

例如:

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

我想先写入文件,然后抛出错误。我知道我可以添加一个函数,在抛出之前我可以调用该函数,但我想知道的是,是否有类似于使用抛出添加默认行为的内容?

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

函数MyError(){
//在此执行一些逻辑操作(例如写入文件)
log(“一些逻辑”);
}

抛出新的MyError()
如果您使用的是NodeJS应用程序,则可以集中管理所有抛出的错误

您还应将错误命名为:

class ApiError extends Error {

  constructor (message, code) {
  super(message);
  this.name = 'ApiError';
  this.code = code;
  }
}
同样,对其他错误类型使用其他名称

对于快速申请

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});
   }
});
注意,如果您是从一个承诺内抛出async/await,这将不会捕获您的错误。您必须以其他方式集中捕获它们,可能是捕获应用程序中所有未处理的拒绝承诺

process.on('unhandledRejection', (reason) => {
  console.log(reason);
  // log error in file
});
同样,您还应该集中捕获所有未捕获的异常

process.on('uncaughtException', (err) => {
  console.log(err);
  // log error in file
});
建议: 就记录文件中的错误而言,只有当您通过其他方式解析文件,将文件发送到logstash等时,这才是一种很好的方法


当您不打算以编程方式解析文件时,请将错误记录在errordb/error表中。通过这种方式查询它们要容易得多:)

错误与Javascript w.r.t NodeJS中的异常不同。错误是错误类的任何实例。可以构造错误,然后将其直接传递给另一个函数或抛出。当您抛出错误时,它将成为异常。2以下是将错误用作异常的示例:

throw new Error('something bad happened');
但您也可以创建一个错误而不抛出它:

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

因为您在评论中提到,您不希望在应用程序的所有文件中都需要错误处理程序文件。您还可以使用NodeJS或使用错误处理程序中间件

我认为您最好的选择是使用自定义抛出。事实上,我总是这样做,为了能够写作

_throw("MyErrorMessage")
所以我会这样做:

//应该在错误路径中使用类似于dot env的内容
require('dotenv').config()
//我只是想假装它在你的机器上工作:
process.env.error_file_path='./myErrors.txt'
//throwLib.js
const util=require('util')
常量fs=require('fs')
const writeFile=util.promisify(fs.appendFile)
_抛出=(stringError)=>{
writeFile(process.env.error\u file\u路径,“error:+stringError+”\n”)。然后(err=>{
如果(错误)
console.log(错误)
抛出新错误(stringError)
}
)
}
//将此导入到您的文件中。
//myFile.js
//一些东西
_抛出('someMessage1')
_抛出('someMessage2')

_throw('someMessage3')
是否要使用try..catch块?但在try-catch中,我还需要调用函数来写入文件。我在寻找,无论抛出在节点JS的整个应用程序中的什么位置,只要有抛出,我的函数都应该运行。你想在节点JS中运行它,对吗?是的,在节点JS中。。!!这样就可以了,但是只要我创建这个函数,我就会在抛出错误的应用程序的每个文件中都需要这个文件。有什么东西我可以玩默认抛出新错误吗?就像错误在窗口对象上一样,你也可以把你的自定义错误放在窗口上。另一个选项是向默认错误对象添加一些功能,然后在抛出它之前调用它:Error.prototype.someMethod=function(){console.log(“test”)};是的,但我要寻找的是添加默认行为,而不希望在每次抛出之前转到每个文件并添加对我的函数的调用。这将需要大量编辑。如果您使用的是node JS,您可以抛出一个字符串:“some error”。然后在应用程序的根上添加一些代码来捕获它:process.on('uncaughtException',function(err){//检查错误是否为youerror});我要试试这个EventEmitter模块。我只是在想在哪里写链接上提到的函数。比如说,我使用emitter.on(eventName,listener),我应该在哪里编写代码?您可以在应用程序的任何位置(app.js中或您希望的单独文件中)编写代码。只要你想发射,就发射
eventEmitter.emit('eventName')请不要忘记投票或将答案标记为接受。因此,它将对其他人有用@Akshyyes,但实际上我现在正在尝试解决方案。再一次,我想我有点困惑了。您在评论中告诉我的示例是发出事件。一定有什么东西可以听这个事件。你是说我应该在app.js中编写一些event.listen,这样每当抛出错误时,我的事件侦听器都会侦听错误事件?是
eventEmitter.addListener('connection',listenerfunction)您可以在任何位置注册listenner,但不能在发出事件之前注册