试试-catch()不捕获错误并抛出错误

时间:2019-07-01 08:59:02

标签: javascript typescript promise try-catch httprequest

我在一个类中有一个方法,该方法应该只抛出错误日志消息,然后在另一个函数中有另一个方法,它将得到此错误并进行控制台处理(目前)。

问题在于它只是在控制台中而不是在上层引发错误...

这是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);
        }
    }

2 个答案:

答案 0 :(得分:2)

看起来很简单,只是忘记在async的定义上使用sendToApp2。由于它不是async,因此在sendToApp2期间不会抛出任何错误,因为它在App2Call被拒绝之前就返回了。

在使用sendToApp2的地方使用await,这表明您期望它返回承诺,因此只需在定义中添加async

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

然后try / catch可以将拒绝作为错误处理。


旁注:目前,try中的catch / sendToApp2毫无意义,因为它所做的只是throw err

答案 1 :(得分:0)

从sendToApp2返回承诺并在调用函数时处理错误

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);
});