当我写入文件时如何正确捕获错误?

时间:2019-06-23 18:25:17

标签: javascript node.js error-handling node-modules

我在捕捉模块fs的writeFile错误时遇到了问题。

我试图尝试/捕获捕获错误并写入日志,但是它不起作用。 在调试器错误中,请勿继续执行catch块,并且在调用过多次之后,没有任何快乐。

const fs = require('fs');

const writeData = (body) => {
    try{
        const stringData = JSON.stringify(body);
            fs.writeFile('./data76/data.json', stringData, {flag: 'a+'} ,(err) =>{
                if(!err){
                    console.log('file was writed');
                }else {
                    console.error('Error writing new data');
                    throw new Error(err);
                }
            });

    }catch(error){
        console.error('THIS ERROR!!!!!');
         let dataError = JSON.stringify(error);
         fs.open('./logs/error.log', 'wx', (err, fd) => {
             if(!err){
                 fs.writeFile(fd, dataError, (err) => {
                     if(!err){
                         fs.close(fd, (err) => {
                             if(!err){
                                 console.log('log was written success');

                     }else{
                                 console.error('file log wasn\'t closed');                                
                             }
                         });
                     }else{
                        console.error('log wasn\'t writed'); 
                     }
                 });
             }else {
                 fs.writeFile(fd, dataError, (err) => {
                     if(!err){
                         console.log('log was writed');
                     }else {
                         console.error('log wasn\'t writed');
                     }
                 });
             }
         });
    };

};

const body = {
    "name": {
        "first": "John",
        "jobtitle": "Driver"
    },
    "uuid_company": "ab667468-d7c5-469e-b402-0bd2d71073fa",
    "license_number": "AB58659",
    "phone": "+19019876512",
    "uuid": "08475753",
    "place_id": "place_not_matter",
    "birthday": "10.12.1967"
};

writeData(body);

结果,我等待catch错误并将其写入文件中。 我的个人记录器

1 个答案:

答案 0 :(得分:1)

等待/承诺之外的

try/catch无法捕获异步回调内部引发的错误。因此,如果您要在fs.writeFile()的回调中处理错误,则需要在fs.writeFile()回调中插入错误处理代码,或者(最好)使用文件处理的Promise版本并让错误通过承诺传播。

此外,大多数写入文件的错误不是暂时性错误。因此,很少尝试再次写入实际上是一种解决方案,而不仅仅是遇到相同的问题。更典型的错误是磁盘已满,媒体错误,卷不响应等。这些错误不太可能通过再次尝试而突然工作。同样,每种特定类型的错误可能需要不同的策略来处理。您是否想针对特定类型的错误制定策略?

此外,fs.writeFile()将直接采用文件路径,然后它将为您处理fs.open()fs.close()。您无需手动打开,写入并关闭它。