Javascript 处理嵌套承诺引发的异常
我不明白为什么我的应用程序会抛出一个未经处理的异常,或者我如何才能避免这个问题。异常在Javascript 处理嵌套承诺引发的异常,javascript,node.js,bluebird,Javascript,Node.js,Bluebird,我不明白为什么我的应用程序会抛出一个未经处理的异常,或者我如何才能避免这个问题。异常在拒绝(新错误(“…”)行中抛出 引发异常的函数: function parseSourceStrings(fileInformation, callback) { var filePath = fileInformation.path var fileExtension = path.extname(filePath) switch(fileExtension) { ca
拒绝(新错误(“…”)
行中抛出
引发异常的函数:
function parseSourceStrings(fileInformation, callback) {
var filePath = fileInformation.path
var fileExtension = path.extname(filePath)
switch(fileExtension) {
case '.pot':
case '.po':
return new Promise(function(resolve, reject) {
poProcessor.processFile(filePath).then(function(result) {
result = addMetaData(fileInformation, result)
resolve(result)
}).catch(function(err) {
reject(err)
})
})
default:
return new Promise(function(resolve, reject) {
reject(new Error('Unknwown file format'))
})
}
}
mv(filePath, targetFilePath, {mkdirp: true}).then(function() {
return uploadHandler.parseSourceStrings(fileInformation)
}).then(function(parsedSourceStrings) {
console.log(parsedSourceStrings)
}).catch(function(err) {
logger.error(err)
next(err)
})
2:50:19 AM - error: Error: Unknwown file format
at result.meta_information (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:34:12)
at Object.parseSourceStrings (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:33:11)
at c:\Users\h9pe\Documents\tms-reworked\app\projects\router.js:117:26
at tryCatcher (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\util.js:16:23)
at Promise.module.exports.Promise._settlePromiseFromHandler (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:512:31)
at Promise.module.exports.Promise._settlePromise (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:569:18)
at Promise.module.exports.Promise._settlePromise0 (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:614:10)
at Promise.module.exports.Promise._settlePromises (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:693:18)
at Promise.module.exports.Promise._fulfill (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:638:18)
at module.exports (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\nodeback.js:42:21)
at c:\Users\h9pe\Documents\tms-reworked\node_modules\mv\index.js:34:26
at FSReqWrap.oncomplete (fs.js:123:15) '/projects/13/update/sourcestrings'
我就是这样调用函数的:
function parseSourceStrings(fileInformation, callback) {
var filePath = fileInformation.path
var fileExtension = path.extname(filePath)
switch(fileExtension) {
case '.pot':
case '.po':
return new Promise(function(resolve, reject) {
poProcessor.processFile(filePath).then(function(result) {
result = addMetaData(fileInformation, result)
resolve(result)
}).catch(function(err) {
reject(err)
})
})
default:
return new Promise(function(resolve, reject) {
reject(new Error('Unknwown file format'))
})
}
}
mv(filePath, targetFilePath, {mkdirp: true}).then(function() {
return uploadHandler.parseSourceStrings(fileInformation)
}).then(function(parsedSourceStrings) {
console.log(parsedSourceStrings)
}).catch(function(err) {
logger.error(err)
next(err)
})
2:50:19 AM - error: Error: Unknwown file format
at result.meta_information (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:34:12)
at Object.parseSourceStrings (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:33:11)
at c:\Users\h9pe\Documents\tms-reworked\app\projects\router.js:117:26
at tryCatcher (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\util.js:16:23)
at Promise.module.exports.Promise._settlePromiseFromHandler (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:512:31)
at Promise.module.exports.Promise._settlePromise (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:569:18)
at Promise.module.exports.Promise._settlePromise0 (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:614:10)
at Promise.module.exports.Promise._settlePromises (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:693:18)
at Promise.module.exports.Promise._fulfill (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:638:18)
at module.exports (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\nodeback.js:42:21)
at c:\Users\h9pe\Documents\tms-reworked\node_modules\mv\index.js:34:26
at FSReqWrap.oncomplete (fs.js:123:15) '/projects/13/update/sourcestrings'
引发的异常:
function parseSourceStrings(fileInformation, callback) {
var filePath = fileInformation.path
var fileExtension = path.extname(filePath)
switch(fileExtension) {
case '.pot':
case '.po':
return new Promise(function(resolve, reject) {
poProcessor.processFile(filePath).then(function(result) {
result = addMetaData(fileInformation, result)
resolve(result)
}).catch(function(err) {
reject(err)
})
})
default:
return new Promise(function(resolve, reject) {
reject(new Error('Unknwown file format'))
})
}
}
mv(filePath, targetFilePath, {mkdirp: true}).then(function() {
return uploadHandler.parseSourceStrings(fileInformation)
}).then(function(parsedSourceStrings) {
console.log(parsedSourceStrings)
}).catch(function(err) {
logger.error(err)
next(err)
})
2:50:19 AM - error: Error: Unknwown file format
at result.meta_information (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:34:12)
at Object.parseSourceStrings (c:\Users\h9pe\Documents\tms-reworked\app\projects\process-uploads\upload-handler.js:33:11)
at c:\Users\h9pe\Documents\tms-reworked\app\projects\router.js:117:26
at tryCatcher (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\util.js:16:23)
at Promise.module.exports.Promise._settlePromiseFromHandler (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:512:31)
at Promise.module.exports.Promise._settlePromise (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:569:18)
at Promise.module.exports.Promise._settlePromise0 (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:614:10)
at Promise.module.exports.Promise._settlePromises (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:693:18)
at Promise.module.exports.Promise._fulfill (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\promise.js:638:18)
at module.exports (c:\Users\h9pe\Documents\tms-reworked\node_modules\bluebird\js\release\nodeback.js:42:21)
at c:\Users\h9pe\Documents\tms-reworked\node_modules\mv\index.js:34:26
at FSReqWrap.oncomplete (fs.js:123:15) '/projects/13/update/sourcestrings'
显然,这只是一个未处理的异常,但是捕获应该捕获抛出的异常没有?如何正确捕获异常?FYI,您可以将第二行
reject()
替换为return Promise.reject(新错误(…)代码>要短得多,切中要害。不确定原始行上出现错误的原因。是否确定这是一个未处理的错误,而不仅仅是记录器的输出。错误(err)
您的异常是因为您的parseSourceString()
函数正在命中switch语句中的默认行,因此返回拒绝承诺。您对uploadHandler.parseSourceStrings(fileInformation)
的调用随后被拒绝,这会导致您点击.catch()
,您会看到记录的错误。这看起来像是编码的,尽管可能您的代码得到了意外的文件扩展名。仅供参考-避免promise构造函数反模式-由于JSFIDLE,您的函数可以简化为@JaromandaX,因此蓝鸟默认拒绝捕获的异常,因为您已经使用了它?仅供参考,您可以替换第二个拒绝()
line withreturn Promise.reject(新错误(…);
要短得多,切中要害。不知道为什么在原始行上出现错误。你确定这是一个未处理的错误,而不仅仅是logger的输出。错误(err)
你的异常是因为你的parseSourceStrings()
函数正在命中switch语句中的默认行,因此返回拒绝承诺。您对uploadHandler.parseSourceStrings(fileInformation)
的调用将被拒绝,这将导致您命中.catch()
您会看到记录的错误。这似乎是按编码方式工作的,尽管您的代码可能会获得意外的文件扩展名。仅供参考-避免promise构造函数反模式-由于JSFIDLE,您的函数可以简化为@JaromandaX X,所以蓝鸟默认拒绝捕获的异常,因为您已经使用了它?