Ответ 1
Предупреждение. Я бы не рекомендовал оригинальный ответ, используя домены, домены устарели в будущем. Мне было очень весело писать оригинальный ответ, но я больше не считаю, что это слишком актуально. Вместо этого я предлагаю использовать излучатели событий и promises, которые имеют лучшую обработку ошибок - вот приведенный ниже пример с promises. Используемый здесь promises Bluebird:
Promise.try(function(){
throw new Error("Something");
}).catch(function(err){
console.log(err.message); // logs "Something"
});
С тайм-аутом (обратите внимание, что мы должны вернуть Promise.delay):
Promise.try(function() {
return Promise.delay(1000).then(function(){
throw new Error("something");
});
}).catch(function(err){
console.log("caught "+err.message);
});
С общей функцией NodeJS:
var fs = Promise.promisifyAll("fs"); // creates readFileAsync that returns promise
fs.readFileAsync("myfile.txt").then(function(content){
console.log(content.toString()); // logs the file contents
// can throw here and it'll catch it
}).catch(function(err){
console.log(err); // log any error from the `then` or the readFile operation
});
Этот подход является быстрым и безопасным, я рекомендую его выше приведенного ниже ответа, который использует домены, которые, вероятно, не будут здесь оставаться.
Я закончил использование доменов, я создал следующий файл, который я назвал mistake.js
, который содержит следующий код:
var domain=require("domain");
module.exports = function(func){
var dom = domain.create();
return { "catch" :function(errHandle){
var args = arguments;
dom.on("error",function(err){
return errHandle(err);
}).run(function(){
func.call(null, args);
});
return this;
};
};
Вот пример использования:
var atry = require("./mistake.js");
atry(function() {
setTimeout(function(){
throw "something";
},1000);
}).catch(function(err){
console.log("caught "+err);
});
Он также работает как обычный catch для синхронного кода
atry(function() {
throw "something";
}).catch(function(err){
console.log("caught "+err);
});
Я был бы признателен за некоторые отзывы о решении
На стороне примечания, в v 0.8, видимо, когда вы поймаете исключение в домене, оно все еще пузырится до process.on("uncaughtException")
. Я имел дело с этим в моем process.on("uncaughtException")
с
if (typeof e !== "object" || !e["domain_thrown"]) {
Однако документация предлагает против process.on("uncaughtException")
каким-либо образом