如何包装这些函数以便始终处理它们的异常?

时间:2011-04-07 23:16:36

标签: javascript exception

我已经仔细查看过这个主题的帖子,找不到我想要的内容。

我有一堆返回字符串的函数,如果输入错误,我希望它们不返回字符串,我也不希望程序退出。我不想在try /中包装每个调用抓住。

function foo(num){
  if(num > 5){
    throw SomeException("Input too big")
  }else{
    return "bar"+num
  }
}

我想记录一个错误,例如“6对于foo来说太大了”,而不是退出程序。但这将是一种api,所以我不希望用户每次使用时都必须尝试/捕获 其中一个功能。这是一个nodejs脚本。

这有效,但是很尴尬:

f = {
  command : function(cmd,arg){
              try {
                console.log(q[cmd](arg));
              }
              catch (e) {
                console.log("Error: " + e + " for " + cmd);
              }
            },
  foo : function(str){
              throw ("foo error");
        },
  foo2 : function(str){
           throw ("foo2 error");
         }

};
f.command("foo",2);
f.command("foo2",3);

2 个答案:

答案 0 :(得分:1)

如果您正在创建其他人将使用的API,并且您想要发出错误信号,那么......抛出异常。如果程序员没有使用您的API捕获该异常,那就是他们的错,而不是您的错;另一方面,如果他们的代码完全不可靠,因为你的函数在错误上做了一些非常奇怪的事情,那么......好吧,这仍然是另一个程序员的错误,因为没有正确检查进入你的API的输入,但是成为一个好公民,抛出异常帮助调试。他们可能不喜欢你在各地放置异常,但是如果你的代码只是默默地做了非常奇怪的事情而不是提供错误是什么的好指示,他们就会讨厌

我也说要记录错误,但是你在JavaScript中这样做,那里没有任何这样的设施。

并且为了记录,这来自一个使用API​​的程序员,这些API既有也有可能在错误上抛出异常;投掷它们的那些通常是我认为写得更好的那些。

答案 1 :(得分:1)

[[编辑]] 这是一个nodeJS脚本。然后使API异步。我们不在nodeJS中进行同步操作。请保存事件循环。

您还可以将API重做为异步

function foo(num, cb){
  if(num > 5){
    cb(SomeException("Input too big"));
  }else{
    cb(null, "bar"+num);
  }
}

foo(5, function(err, data) {
   ...
});

您可以引用公共记录器实例。

MyLibrary.errorHandler = defaultErrorHandler() || config.errorHandler

然后将defaultErrorHandler设为

function(error) {
    if (console && console.log) { console.log(error.message); }
    $("#errordiv").text(error.message);
}

function foo(num){
  if(num > 5){
    MyLibrary.errorHandler(new Exception("blargh"));
  }else{
    return "bar"+num;
  }
}