Node.js stream pipeline无法捕获Transform _transform中抛出的错误如何解决
问题原因
你在_transform方法内直接主动抛出同步错误的写法不符合Node.js Transform流的错误处理规范:_transform作为回调风格的方法,官方要求所有异常都需要通过第一个参数传递给done()回调,才会被封装为流的error事件向外分发。你直接throw的错误会跳出stream的内部处理逻辑,变成全局未捕获异常,自然无法被各个流的error监听器、pipeline的错误回调捕获。
解决方案
1. 修改_transform的错误抛出逻辑
把原来直接throw的逻辑替换为通过done回调传递错误,修改后的对应代码片段如下:
if(!(c in this.nucleotides) && !(c in this.aminoacids) && !(c in this.permissables)) { const err = new Error("Unexpected character in sequence (" + felem.def + "): " + c + "."); // 把错误传给done回调,结束当前transform处理 return done(err); }
修改后错误会被正常封装为流的error事件,被pipeline统一捕获。
2. 简化单元测试逻辑
stream.pipeline本身已经自动监听了链路上所有流的error事件,不需要你给每个流单独绑定error监听器,最终的回调就能拿到链路中产生的所有错误,简化后的测试代码参考如下:
it('Should throw an error when sequence has invalid character.', function(done) { this.timeout(5000); pipeline( fs.createReadStream("../files/bad.fasta"), new split2(), new FASTAElement(null), new FASTASeqType(null), new FASTAWriter(null,80), fs.createWriteStream("../files/bad_typed.fasta"), err => { // 校验错误符合预期 assert.ok(err); assert(err.message.includes('Unexpected character in sequence')); done(); } ); });
内容的提问来源于stack exchange,提问作者jallmer
相关产品推荐
相关产品推荐

