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

时间:2017-11-02 05:46:01

标签: javascript node.js error-handling throw

有没有办法在javascript中为throw事件添加默认行为。 就像我试图在抛出错误时添加到文件中一样:

示例:

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

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

4 个答案:

答案 0 :(得分:1)

错误与Javascript w.r.t NodeJS中的异常不同。错误是Error类的任何实例。可以构造错误,然后直接传递给另一个函数或抛出。当你抛出一个错误时,它就变成了一个例外.2这是一个使用错误作为例外的例子:

throw new Error('something bad happened');

但你也可以在不抛出错误的情况下创建错误:

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

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

答案 1 :(得分:1)

我认为你最好的选择是使用自定义投掷。我实际上总是这样做,能够写

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

答案 2 :(得分:0)

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



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

throw new MyError()




答案 3 :(得分:0)

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

您还应该为错误命名:

#create screen
screen = pygame.display.set_mode((1200,800))
#creat game object
ship = Ship(screen)

while True:        
    gf.check_events(ship)


def check_events(ship):
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:                
            ship.rect.centerx +=  1

同样地将其他名称用于其他错误类型。

对于明确的申请,

class ApiError extends Error {

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

请注意,如果你是在一个Promise,async / await中投掷,这将无法捕获你的错误。您必须以其他方式集中捕获它们,可能是通过在您的应用中捕获所有未处理的承诺拒绝

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

同样,您还应该集中捕获所有未捕获的异常

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

建议: 就文件中的日志记录错误而言,只有当您通过其他方式解析文件,将文件发送到logstash等时,这是一种很好的方法。

如果您不打算以编程方式解析文件,请将错误记录在errordb / error-table中。它们更容易查询:)