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 with
return Promise.reject(新错误(…);
要短得多,切中要害。不知道为什么在原始行上出现错误。你确定这是一个未处理的错误,而不仅仅是
logger的输出。错误(err)
你的异常是因为你的
parseSourceStrings()
函数正在命中switch语句中的默认行,因此返回拒绝承诺。您对
uploadHandler.parseSourceStrings(fileInformation)
的调用将被拒绝,这将导致您命中
.catch()
您会看到记录的错误。这似乎是按编码方式工作的,尽管您的代码可能会获得意外的文件扩展名。仅供参考-避免promise构造函数反模式-由于JSFIDLE,您的函数可以简化为@JaromandaX X,所以蓝鸟默认拒绝捕获的异常,因为您已经使用了它?