Хорошая практика программирования в отношении обработки исключений - PullRequest
0 голосов
/ 05 апреля 2011

Рассмотрим иерархию функций, функция Four () вызывает Three (), который вызывает Two (), который снова вызывает One () для выполнения работы:

Function One($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  }
  // .......... Do the Job ................
}
Function Two($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     One($x);
  }
}
Function Three($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     Two($x);
  }
}
Function Four($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  } else {
     Three($x);
  }
}

Если я вызываю четыре сСтроковое значение приведет к возникновению исключения.

Теперь рассмотрим следующий код с исключением только в родительской функции.

Function One($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  }
  // .......... Do the Job ................
}
Function Two($x) {
     One($x);
}
Function Three($x) {
     Two($x);
}
Function Four($x) {
     Three($x);
}

Здесь я вызываю Four () и передаю строку.Также может произойти исключение.

Итак, какой из них является лучшим и почему?
Когда я начинаю писать код, я заканчиваю тем, что пишу много обработок исключений, plz help.

Ответы [ 5 ]

2 голосов
/ 05 апреля 2011

Если для функции function one требуется $x, и это единственная функция, которая использует $x, вы можете выбросить исключение только в function one. Я предполагаю, что функция два, три и четыре будут также делать другие вещи (иначе они бесполезны). В этом случае вы должны проверить значение также в этих функциях. Если они еще не используют $x, они могут использовать в будущем. В этом случае легко забыть проверить значение $x и появится ошибка.

2 голосов
/ 05 апреля 2011

IME - это хорошая практика, чтобы сбой как можно ближе к проблеме. При этом, я думаю, вариант 1 - это путь. Это делает так, что когда возникает исключение, вы уверены, что проблема была в вызове Four, и вы можете отлаживать его оттуда. Вариант 2 прост, но вы не знаете, в чем проблема: четыре, три, два или один. По мере усложнения программного обеспечения ваше время будет отлаживаться.

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

альтернатива, я бы знал след, и вы можете использовать как

Function One($x) {
  if(!is_int($x)) {
     throw Exception("X must be integer");
  }
  // .......... Do the Job ................
}
Function Two($x) {
    try
    {
        One($x);
    }
    catch(Exception $e)
    {
        throw $e;
    }
}
Function Three($x) {
    try
    {
         Two($x);
     }
    catch(Exception $e)
    {
        throw $e;
    }
}
Function Four($x) {
    try
    {
     Three($x);
     }
    catch(Exception $e)
    {
        throw $e;
    }

}

в этом случае вы можете знать, где находится ошибка, и только 1 проверка is_int.

0 голосов
/ 06 апреля 2011

Я думаю, это во многом зависит от того, для чего предназначены функции.

Если значение x является критическим для функции, то исключение следует обработать в этой функции. Если он используется только для передачи параметров, вы можете позволить ему перейти к последней функции.

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

Как правило, исключение означает, что у вас расточительные вычисления. Поэтому модель 1 позаботится о том, чтобы вы этого не делали.

Серверная обработка ценна для всех ...:)

0 голосов
/ 05 апреля 2011

иди здесь и ты можешь найти ответ:

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