2017-02-13 12 views
3

От узла doc:Когда методы асинхронного броска и как вы их поймаете?

Горстка обычно асинхронных методов в API Node.js может все еще используют механизм броска поднять исключения, которые должны быть обработаны с помощью TRY/поймать. Нет исчерпывающего списка таких методов; , пожалуйста, обратитесь к документации каждого метода, чтобы определить необходимый механизм обработки ошибок .

Может ли кто-нибудь привести пример такой функции, которая асинхронна и по-прежнему бросает? Как и когда вы получаете исключение?

В частности. Как они относятся к такой функции:

try 
{ 

    obj.someAsync("param", function(data){ 
        console.log(data); 
       }); 
}catch(e) 
{ 

} 

Теперь обычно я знаю, выше, не имеет смысла -Потому, когда обратный вызов выполняется, try блок может уже вышел.

  • Но какой пример содержится в выдержке из документации? Если метод async генерирует, как говорят, где, когда и как должен ли я его обрабатывать? (или, может быть, если вы продемонстрируете такую ​​функцию, можете ли вы показать, где в ее документе указано, как обращаться с ней, как указано в цитате?)
+0

Можете ли вы привести пример такой функции, я мог бы попробовать ее. –

+0

@AbhinavGauniyal Хорошо, если вы внимательно посмотрите на вопрос, я ищу эту функцию (или гипотетическую) и способы, которыми вы сами справляетесь с этим –

+0

ой, не уверен, как я пропустил это. Обычно я видел ошибки, передаваемые как параметр «err» из родительской асинхронной функции в обратный вызов, поэтому мне также интересно. –

ответ

-1

afaik Есть три способа, которые функция «асинхронная» может «бросить»; и как поймать каждого из них:

  • как и любой другой функции (. иначе кто-то перепутались): Я бы не поймать этих случаев, потому что они не должны быть в моем коде, и ловить такие ошибки делает его труднее найти и исправить их.

function foo(){ 
 
//someone messed up, better fixing than catching this 
 
return new Prooooooooooomise((resolve) => 42); 
 
} 
 

 
try { 
 
foo(); 
 
}catch(err){ 
 
console.error(err); 
 
}

  • Обещания:

function foo(){ return Promise.resolve('bar') } 
 

 
foo().then(value => value =========> 'error') 
 
.catch(err => { 
 
\t console.error(err); 
 
\t return "fixedValue"; 
 
});

  • и узлы обратного вызова Синтаксис/шаблон:

function foo(value, callback){ 
 
setTimeout(function(){ 
 
\t if(Math.random() < .5){ 
 
\t \t callback("I don't like to", undefined); 
 
\t }else{ 
 
\t \t callback(null, value * 2); 
 
\t } 
 
}, 500); 
 
} 
 

 
foo(21, function(err, data){ 
 
if(err){ 
 
\t //no try..catch at all 
 
\t console.error(err); 
 
}else{ 
 
\t //do whatever with data 
 
} 
 
})

Это наиболее распространенные ошибки асинхронных вы пришли вместе; ну, первый - это просто ошибка в асинхронном mothod.

+0

Третий пример не бросает ничего .. –

+0

и быть справедливым, ни второй. Этот вызов улавливается для обещания, и документы четко указывают - «исключения, которые должны обрабатываться с помощью try/catch» –

+0

@AbhinavGauniyal, и что? Вы говорите, что вы не можете поймать асинхронные ошибки, потому что инструменты для их обработки не включают блок try..catch? – Thomas

3

Асинхронные методы, подобные одному из вашего примера, обычно вызывают ошибки программиста, такие как плохие параметры, и они вызывают обратный вызов с ошибкой для операционных ошибок.

Но есть также асинхронные функции в ES2017 (объявлены с async function) и эти ошибки сигнала, отклоняя обещание, которое они возвращают, - которые превращаются в исключение, когда вы используете их с ключевым словом await.

Примеры:

function x(arg, cb) { 
    if (!arg) throw new Error('Programmer error: bad arguments'); 
    setTimeout(() => { 
     cb(new Error('Operational error: something bad happened')); 
    }, 2000); 
} 

Теперь, когда вы его используете вы обычно не хотите обрабатывать ошибки программиста - Вы хотите, чтобы исправить их. Таким образом, вы не делаете этого:

try { 
    x(); 
} catch (err) { 
    // Why should I handle the case of bad invocation 
    // instead of fixing it? 
} 

И эксплуатационные ошибки вы справляетесь, как это:

x(function (err) { 
    if (err) { 
     // handle error 
    } else { 
     // success 
    } 
}); 

Теперь, если у вас есть функция, которая не принимает обратный вызов, но возвращает обещание:

function y() { 
    return new Promise((res, rej) => setTimeout(() => rej('error'), 2000)); 
} 

Затем обработать ошибку так:

y().catch(error => { 
    // handle error 
}); 

или, при использовании await:

try { 
    await y(); 
} catch (err) { 
    // handle error 
} 

Для получения дополнительной информации о разнице между эксплуатационными ошибками и ошибками программиста см:

Для больше информации о обещаниях и async/await см. Ссылки в this answer.

+0

Примером этого может быть, если вы должны были вызвать 'dns.lookup ({})'. Это бросит. –

+0

Я пытаюсь понять эту часть документации - «это должно быть обработано с помощью try/catch», если вы проигнорируете это и по-прежнему обрабатываете его с помощью обычного синтаксиса if (err) {} ', то либо в документации указано, что это неправильно, либо вы не обрабатываете их правильно. ** Обратите внимание, что в документации есть другой раздел 'if (err) {}' способ обработки ошибок, который означает, что они отличаются от точки «try/catch», которая добавляет до путаницы. –

+0

@rsp: Я правильно понял, если мне нужно использовать вашу * первую * функцию 'x' из вашего примера, мне нужно было бы заключить ее в try/catch и проверить err внутри обратного вызова? –