Javascript 如何更正写入文件时的捕获错误?
我在捕获模块fs writeFile中的错误时遇到问题 我试图尝试/catch以获取catch错误并写入日志,但它不起作用。 在debbuger错误中不要继续执行catch块,并且在调用太多次之后,什么都没有Javascript 如何更正写入文件时的捕获错误?,javascript,node.js,error-handling,node-modules,Javascript,Node.js,Error Handling,Node Modules,我在捕获模块fs writeFile中的错误时遇到问题 我试图尝试/catch以获取catch错误并写入日志,但它不起作用。 在debbuger错误中不要继续执行catch块,并且在调用太多次之后,什么都没有 const fs = require('fs'); const writeData = (body) => { try{ const stringData = JSON.stringify(body); fs.writeFile('.
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);
结果,我等待捕获错误并将其写入文件。
我的个人记录器
try/catch
在wait/promises之外无法捕获异步回调内部抛出的错误。因此,如果您试图在fs.writeFile()
的回调中处理错误,则需要在fs.writeFile()
回调中插入错误处理代码,或者(更好的是)使用promise版本的文件处理,让错误通过promises传播
此外,大多数写入文件的错误都不是暂时性错误。因此,尝试再次编写实际上是一种解决方案,而不是遇到相同的问题,这将是非常罕见的。更典型的错误是磁盘已满、媒体错误、卷未响应等。。。只要再试一次,这些都不可能突然奏效。此外,每种特定类型的错误可能需要不同的策略来处理。是否有您遇到的特定类型的错误需要制定策略
另外,
fs.writeFile()
将直接获取文件路径,然后它将为您处理fs.open()
和fs.close()
。您不需要手动打开、写入和关闭它。对于异步抛出的异常,您不能使用try
/catch
,例如writeFile
回调中的异常。(如果您使用承诺和等待
,则可以)。不要抛出错误,只需将错误处理代码放入else
块中,并删除try
@IlyaRogatkin-除非使用承诺,否则无法从异步回调抛出错误。记住,顶级函数已经在调用异步回调时返回。当您从回调中抛出时,它所做的只是返回到某个文件系统平台代码中,而不做任何操作。当从异步回调抛出时,您无法捕获更高级别的异常。我可以使用writeFileSync,或者这不是node.js中的最佳实践?@ILYAROGAKIN-fswriteFileSync()
应该只在启动/初始化时使用,或者在某个单用户脚本中使用(该脚本永远不会有来自多个用户的多个请求)。因此,在服务器中,您只会在服务器初始化时使用它,而不会在请求处理程序中使用它。由于node.js运行Javascript单线程,并且fs.writeFileSync()
会阻塞该线程,因此会破坏服务器的可伸缩性。