Как я могу обернуть эти функции, чтобы их исключения всегда обрабатывались? - PullRequest
1 голос
/ 08 апреля 2011

Я просматривал темы на эту тему и не могу найти то, что хочу.

У меня есть набор функций, которые возвращают строку, и я хочу, чтобы они не возвращали строку, если ввод неправильный, и я не хочу, чтобы программа тоже выходила, И я не хочу оборачивать каждый вызовв попытке / поймать.

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 ]

1 голос
/ 08 апреля 2011

[[Edit]] Это скрипт 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;
  }
}
1 голос
/ 08 апреля 2011

Если вы создаете API, который будут использовать другие, и вы хотите сообщить, что произошла ошибка, ну ... выбросите исключение. Если это исключение не будет обнаружено программистом, использующим ваш API, это их вина, а не ваша; с другой стороны, если их код становится все шатким, потому что ваша функция делает что-то действительно странное с ошибкой, хорошо ... хорошо, это все еще ошибка другого программиста в том, что он не проверяет должным образом входные данные в вашем API, но должен быть хорошим гражданином и помочь их отладке, выбрасывая это исключение. Они могут не любить вас за то, что вы помещаете исключения повсюду, но они будут ненавидеть вас, если ваш код просто тихо делает действительно странные вещи, вместо того, чтобы дать хорошее представление о том, что это за ошибка.

Я бы сказал, что также регистрировать ошибку, но вы делаете это в JavaScript, где нет такой возможности.

И, к сведению, это исходит от программиста, который использовал API, которые и создают, и не генерируют исключения при ошибках; те, которые бросают их, как правило, те, которые я считаю лучше написанными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...