尝试-捕获()未能捕获错误并反而抛出它

3

我在一个类中有一个方法,该方法只能抛出错误日志消息,然后在另一个函数中有另一个方法会获取这些错误并将它们输出到控制台(目前只是如此)。

问题在于它只在控制台上抛出错误,而不是在更高级别上抛出...

这些方法来自于 file1.ts:

private sendToApp2(App2Url: string, logObject: object) {
    try
    {
        let uriOptions = {
            host: this.hostname,
            port: this.port,
            path: '/App2',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Api-version': '1'
            }
        };

       this.App2Call(uriOptions, JSON.stringify(logObject));
    }
    catch (err) {
        throw err;
    }
}

private App2Call(params: Object, data: string) {
    return new Promise((resolve, reject) => {
        try {
            let req = http.request(params, (response) => {
                response.on('data', (data) => {
                    resolve(data);
                });

            }).on('error', (err: Error) => {
                reject(new Error(err.message));
            });

            req.write(data);
            req.end();
        }
        catch (err) {
            reject(new Error(err.message));
        }
    });
}

在第二个文件中,我使用这个逻辑来捕获错误并将其输出到控制台:
GetErrors() {
        try {
            // initialize the class object    

            let getErrors = new FirstClass();
            await getErrors.sendToApp2(this.App2Url, this.logObject);
        }
        catch (err) {
            console.log(err);
        }
    }

1
如果没有使用await,Promise的拒绝不会成为可以被catch捕获的异常。 - Bergi
2个回答

2
看起来只是在定义sendToApp2时忘记使用async。由于它不是async,所以在sendToApp2期间没有抛出错误,因为它在App2Call的承诺被拒绝之前返回。

当您使用sendToApp2时,您使用了await,这表明您希望它返回一个承诺,所以只需将async添加到定义中即可:

private async sendToApp2(App2Url: string, logObject: object) {
//      ^^^^^

那么try/catch可以将rejections作为错误处理。


顺便说一句:目前在sendToApp2中使用try/catch没有意义,因为它只是throw err


是的,谢谢! :) 异步/等待正是我所需要的。 - user3063909

0
从sendToApp2返回一个promise,并在调用该函数时处理错误。
private sendToApp2(App2Url: string, logObject: object) {
        let uriOptions = {
            host: this.hostname,
            port: this.port,
            path: '/App2',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Api-version': '1'
            }
        };

       return this.App2Call(uriOptions, JSON.stringify(logObject));
}
etErrors.sendToApp2(this.App2Url, this.logObject).then(
     function(){},
     function(err){ //error callback,or you can use catch();
       alert(err);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接