Я вхожу в Promises (используя библиотеку Q) в node.js. Я портировал весь мой код, основанный на обратном вызове, на Promises, и все кажется прекрасным. Тем не менее, есть одна модель, которая, как мне кажется, продолжает реализовывать, и я нахожу ее подозреваемой. Я чувствую, что есть, вероятно, лучший способ справиться с этим, но я на самом деле не уверен, что.Как вы произвольно обрабатываете ошибку в обещании Javascript?
В принципе, если у вас есть возможность получить сообщение об ошибке из асинхронной операции, и вы можете или не сможете ее обрабатывать локально. Например, обработка определенного класса ошибок и распространение остальных. В обратных вызовов на основе кода, я хотел бы сделать что-то вроде:
fs.readFile(path, 'utf-8', function (err, data) {
if(err) {
if(err.code == "ENOENT") {
cb(null, null); //it's fine to return null and eat the error
} else {
cb(err, null); //this is probably not fine, so barf
}
return;
}
...
});
В Promise основе кода, это становится:
return fs.readFile(path, 'utf-8').then(function(data) { ... }, function(err) {
if(err.code == "ENOENT") {
return null; //it's fine to return null and eat the error
}
throw err; //this is probably not fine, so barf
});
Часть мне не нравится это повторное метание ошибки , Я исхожу из .NET-фона, и там, в основном, можно использовать огневое преступление для повторного исключения такого исключения. Однако, может быть, в JavaScript это не имеет значения? Или, есть способ написать этот код, о котором я не знаю?
Почему это 'fireable преступления повторного выбрасывание исключение вроде this' в .NET? – Jeff
Потому что это сбивает исходную трассировку стека, поскольку она установлена на 'throw', а не на' new' –
Мне не нравится признавать превосходство Java над C#, но когда в Tomcat возникает исключение, он показывает вторую/третью трассировка стека, если исключение имеет элемент getCause(). – Katana314