Попробуй - catch () не ловит ошибки и выбрасывает их - PullRequest
2 голосов
/ 01 июля 2019

У меня есть метод в классе, который должен генерировать только сообщения журнала ошибок, а затем другой метод в другой функции, которая будет получать эти ошибки и утешать их (пока).

Проблема в том, что онпросто выдает ошибку в консоль, а не на верхний уровень ...

Это методы из 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 ]

2 голосов
/ 01 июля 2019

Это похоже на простой случай, когда вы забыли использовать async в определении sendToApp2. Поскольку это не async, в течение sendToApp2 не выдается никаких ошибок, поскольку он возвращается до того, как обещание от App2Call отклоняется.

Где вы используете sendToApp2, вы используете await, что предполагает, что вы ожидаете, что оно вернет обещание, поэтому просто добавьте async к определению:

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

Тогда try / catch может обрабатывать отклонения как ошибки.


Примечание: прямо сейчас, нет никакого смысла в try / catch в sendToApp2, так как все, что он делает, это throw err.

0 голосов
/ 01 июля 2019

возвращает обещание из 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);
});
...