尝试在Node.JS中捕获函数

时间:2015-07-06 01:37:25

标签: javascript node.js

参考Async Node.JS,以下功能是否正常? 我的意思是它写得正确,错误将被处理或在Async Node.JS方面写错了? 如果写错了如何在异步节点中正确写入它?

function genid(callback){
  try {
    var id = mylib.generate();
    callback(null, id);
  } catch(err){
    callback(err);
    }
}

2 个答案:

答案 0 :(得分:1)

对于初学者,如果mylib.generate()同步返回id,我怀疑是否需要异步,它可以简单地为:

function genid(callback){
    return mylib.generate();
}

但如果mylib.generate()是异步的,除非mylibmylib.generate不存在或定义不正确,否则我们如何才能获得错误同步...假设它是异步的:

function genid(callback){
    try{
        mylib.generate(function(err, id){       // assuming that is how mylib.generate callback is styled
                if(err) return callback(err);
                callback(null, id);
        });
    }catch(e){
        callback(e);
    }
}

或者它可以简单地简化为:

function genid(callback){
    try{
        mylib.generate(callback);
    }catch(e){
        callback(e);
    }
}

答案 1 :(得分:1)

这样就不会发现所有的错误。测试这个的一个简单方法是编写一些看起来像你的代码。

function main() {
  try {
    cb();
    console.log('This will still run because async.');
  } catch (e) {
    console.log('This will not run.');
    console.log(e);
  }
}

function cb() {
  setInterval(function() {
    throw 'This is an error!';
  }, 1000);
}

main();

该代码将中断并且不会被try / catch处理。那么代码捕获了什么?

function cb() {
  throw 'This is an error';
  setInterval(function() {
    throw 'This is an error! But it will not run this time.';
  }, 1000);
}

在此代码中,我们更改了cb以立即抛出错误。它还会捕获同步调用的错误。

function cb() {
  (function() {
    throw 'This will also throw.';
  })();
}

现在您已经学习了一些JavaScript内容,我们能做些什么?没有JavaScript语言构造来强制您捕获所有异步错误。 Node有一些东西可以帮助你捕获错误 - 你可以阅读它here。这是一个例子:

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});

throw 'An error';

这将捕获抛出的错误。 (确保在抛出错误之前处理错误。)

在异步JavaScript中有一种称为Promises的模式。你不能强迫事物正确捕获,但如果你使用正确实现Promises的库,你可以使用这种模式。

var Promise = require('promise');

function catchThis() {
  return Promise.reject(new Error('This is an error'));
}

var p = Promise.resolve(catchThis());

p.then(
  //on Success
  function() {
    console.log('This will never call');
  },
  // on Error
  function(err) {
    console.log(err);
  }
);

注意,我不是在这里“扔”任何东西。它没有解决我捕获所有随机“抛出”问题,但它给了我一个模型来管理错误,而不会有错误滑倒的风险。注意:ES6(最新的JavaScript标准)本身支持Promise。