2017-02-09 2 views
1

Например, я просто пытался поймать ENOENT по наивности делают это:Почему невозможно попробовать/уловить некоторые вещи?

try { 
    res.sendFile(path); 
} catch (e) { 
    if (e.code === 'ENOENT') { 
    res.send('placeholder'); 
    } else { throw e; } 
} 

Это не работает!

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

Я думаю, что, может быть, сам выражает себя. И они хотят, чтобы ошибки не убивали сервер так быстро. Это понятно.

Но я получаю эту хромую сообщение:

Error: ENOENT: no such file or directory, stat '<file>' at Error (native)

Не большой.

+0

ОК, поэтому я на 99% уверен, что ответ на мой вопрос - это просто «фреймворк, пойманный для вас», но это не очень полезно –

+0

http://softwareengineering.stackexchange.com/questions/144326/try-catch- in-javascript-isnt-it-a-good-practice https://bytearcher.com/articles/why-asynchronous-exceptions-are-uncatchable/ –

+0

Его из-за асинхронного характера Javascript, что код проглотит исключение вы бросаете. –

ответ

3

Благодаря documentationres.sendFile является асинхронной функции, поэтому try/catch не будет работать в этом случае. Если вы хотите обработать результат res.sendFile, вы должны пройти callback в качестве последнего аргумента.

res.sendFile(path, function (e) { 
    if (e) { 
    if (e.code === 'ENOENT') { 
     res.send('placeholder'); 
    } else { 
     throw e; 
    } 
    } 
}); 
+0

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

2

Из-за асинхронного характера Javascript, что код не поймает исключение, которое вы бросаете. res.sendFile выполнен за пределами области try, а исполнение try закончится после вызова метода res.sendFile.

Вот причина, почему это всегда рекомендуется использовать механизм обратного вызова объекта Err в качестве первого аргумента функции обратного вызова, и вы можете проверить, что прежде чем приступить

res.sendFile(path, function (e) { // check the error first // then procedd with the execution });

1

Вообще говоря, вы хотите чтобы избежать использования исключений для управления потоком программы.

Кроме того, поскольку вы, по-видимому, программируете это в Node.js, вы передаете функцию обратного вызова, чтобы поддерживать Node асинхронно. Node.js не многопоточен, потому что JavaScript не является многопоточным, поэтому он не может одновременно иметь более одного вещания. Это означает, что если ваш код зависает от обработки исключения, ничего больше не происходит. И Исключения стоят дорого. Выполнение дорогостоящей очистки в однопоточном серверном приложении может повредить производительности и масштабируемости. Сам JavaScript сам по себе не асинхронен. Это асинхронно, только если вы используете функции обратного вызова, чтобы ослабить его.

Таким образом, когда вы передаете функцию обратного вызова для res.send, эта функция вызывается асинхронно, когда функция res.send заканчивается (или выходит из строя из-за ошибки), без накладных расходов на исключение. Таким образом, если вы хотите обрабатывать ошибки, метод обратного вызова - это способ сделать это.

Смежные вопросы