2015-11-05 3 views
2

Я вхожу в 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 это не имеет значения? Или, есть способ написать этот код, о котором я не знаю?

+0

Почему это 'fireable преступления повторного выбрасывание исключение вроде this' в .NET? – Jeff

+0

Потому что это сбивает исходную трассировку стека, поскольку она установлена ​​на 'throw', а не на' new' –

+0

Мне не нравится признавать превосходство Java над C#, но когда в Tomcat возникает исключение, он показывает вторую/третью трассировка стека, если исключение имеет элемент getCause(). – Katana314

ответ

2

Возможно, в JavaScript это не имеет значения?

Действительно, это не имеет значения. Повторное создание - это не плохая практика, и трассировка стека (если она вообще используется в асинхронной среде) не пострадает от этого.

У JS нет способа условно уловить исключения, основанные на их типе, вы всегда должны их поймать. Некоторые библиотеки обещаний, Bluebird specifically, действительно предлагают синтаксический сахар для сопоставления образцов по ошибкам.

Есть ли способ написать этот код, о котором я не знаю?

Если вы не любите throw ключевое слова, или опасаетесь, что это наносит ущерб вашего объекта исключения (не должно), вы можете использовать эквивалентную

return Promise.reject(err); 
+0

Хорошо, хорошо знать, что это не имеет значения! –

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