Профессиональное программирование на PHP

Страница 93 из 591


96 Глава 3 Обработка ошибок

Использование иерархии исключений

Можно заставить блок try использовать несколько блоков catch, если требуется обрабатывать различные ошибки по-разному. Например, можно модифицировать пример функции вычисления факториала так, чтобы дополнительно обрабатывать случай, когда значение $п слишком велико для математических средств РНР.

class OverflowException {} class NaNException {} function factorial($n) {

if(!preg_match('/*\d+$/', $n) || $n < 0 ) { throw new NaNException;

}

else if ($n ==0 || $n == 1) { return $n;

}

else if ($n > 170 ) {

throw new OverflowException;

}

else {

return $n * factorial($n - 1);

}

}

Теперь каждая ошибка обрабатывается отдельно: <?РНР

if($_POST["input"]) { try {

$input = $_P0ST['input']; $output = factorial($input); print "$_P0ST[input]! = $output";

catch (OverflowException $e) {

print "Запрашиваемое значение слишком велико.";

}

catch (NaNException $e) {

print "Факториал может быть вычислен только для натуральных

чисел."; }

}

?>

Очевидно, что теперь необходимо отдельно перечислить каждый из возможных случаев. Такой подход громоздок в написании, а также потенциально опасен, так как по мере роста библиотек будет расти и множество возможных исключений, в результате чего легко случайно пропустить какую-либо исключительную ситуацию.

Для того чтобы решить данную проблему, можно сгруппировать исключения в семейства и создать дерево наследования для их связи:

class MathException extends Exception {} class NaNException extends MathException {} class OverflowException extends MathException {}




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006