обработка ошибок

Slastik

Новичок
обработка ошибок

думал как реализовать обработку ошибок в своем проекте.

пришел к следующему решению :
хоть и до конца не понимаю чем исключения так хороши, но решил использовать их, так как все их хвалят не нахвалятся )

выделил три типа ошибок

ошибки работы с базой (допустим ошибки подключения к базе)
ошибки пхп (допустим открытие несуществуещего файла)
ошибки пользователя (допустим неверный логин или пароль)

решил создать три класа наследника от Exception

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

на примере класа обработки ошибок работы с базой покажу что у меня получилось:


PHP:
class dbException extends Exception 
{

  private $errMessage;

  public function __construct($errMessage) 
  { 
      parent::__construct();
      $this->errMessage = $errMessage; 
  }

  public function getInfo() 
  {
		   if (DEBUG == 0)
		   {
			    // файл с описанием ошибок 
                            require("errors.php");
			    echo $errMessage[$this->errMessage];
		   }
		   elseif (DEBUG == 1)
		   {
				echo 'developers mode <br/>';
				echo '<hr>';
				echo mysql_error();
				echo '<br/> File Name: <b>'.$this->getFile().'</b><br/> 
                                Error in line: <b>'.$this->getLine().'</b><br/>Trace path: <b>'. 
                                $this->getTraceAsString().'<b>'.'<br/>';                                  

		   }
  }

}

пример использования :

PHP:
  try 
{
   @$link = mysql_connect("localhost", "mysql_user", "mysql_password");
	if (!$link)
	{
	  throw new dbException("NoConnection");
	}
} 

catch (dbException $e)
{
	  $e->getInfo();

}
правда есть одна проблема, не знаю как передать сообщение
вызваное например ошибкой открытия не существуещего файла в свой обработчик, для базы есть
функция mysql_error() а как быть с пхп

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

ну вот собственно хотелось бы услышать ваше мнение о таком изврате
не придумал ли я какой то кривой велосипед?
 

Slastik

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

svetasmirnova

маленький монстрик
А исключения они не непосредственно для *обработки* ошибок. Они для того, чтобы их выкидывать в случае исключительных ситуаций. Пример:
PHP:
function devide_exception($x, $y) {
if (0 == $y) throw Exception('Деление на ноль');
return $x/$y;
}
//сравнить с:
function devide_return($x, $y) {
if (0 == $y) return false;/*'какое-то значение, не являющееся числом.'*/
return $x/$y;
}

//вызов:
try {
$x = array();
$x[] = devide_exception(0, 4);
$x[] = devide_exception(5, 4);
$x[] = devide_exception(3, 2);
$x[] = devide_exception(6, 0);
$x[] = devide_exception(5, 3);
} catch (Exception $e) {
//обработка один раз пишем
}
echo array_sum($x);
//сравнить с:
$x = array();
$x[] = devide_return(0, 4);
if (false == current($x)) //а вот тут мы приняли за ошибку валидное значение
$x[] = devide_return(5, 4);
if (false === current($x)) //что-то с этим делаем
$x[] = devide_return(3, 2);
if (false === current($x)) //do_something;
$x[] = devide_return(6, 0);
if (false === current($x)) //do_something;
$x[] = devide_return(5, 3);
if (false === current($x)) //do_something;
echo array_sum($x);
 

Slastik

Новичок
Спасибо svetasmirnova

Автор оригинала: svetasmirnova
if (false == current($x)) //а вот тут мы приняли за ошибку валидное значение
if (false === current($x))
ну а если написать так, то не приймет.

то есть вы рекомендуете не использовать исключения именно для обработки
а использовать set_error_handler() + trigger_error() ?
 

svetasmirnova

маленький монстрик
Нее, я ничего не рекомендую :)
Я выбрасываю исключения в set_error_handler() и ловлю их потом со своими: и собак ставить не нужно, и if-ов этих бесконечных, и однообразненько всё. Но можно и по-другому.
 

Slastik

Новичок
svetasmirnova

а можно какой нибудь примерчик вашего метода в действии?
 
Сверху