Чем не нравится? Почему "и потом все должны будут наследовать"? Результирующие объекты будут отличных классов от "ExceptionForLog"?Конечно можно сделать наследника от Exception и потом все должны будут наследовать этот новый класс, но это как-то не очень мне нравится.
class Test {}
class Test2 extends Test {}
$t = new Test();
$t = (Test2)$t;
class Test{
protected function someMethod(){
// базовая реализация
}
}
class Test2 extends Test{
// унаследовали оригинальный someMethod
}
class Test3 extends Test{
protected function someMethod(){
// неустраивает базовая реализация, переопределям
}
}
$t2 = new Test2;
$t2->someMethod(); // метод базового класса
$t3 = new Test3;
$t3->someMethod(); // переопределенный вариант
значит надо не экспкшены оборачивать, а унифицировать способ их обработкиЕсли в проект я добавлю либы не моего производства, то они соответсвенно не будут наследовать MyException, а будут наследовать Exception, а значит часть ексепшенов у меня будут логироваться, а дргуая часть не будет.
...
catch (Exception $e)
{
new Log($e)
}
class Log
{
// $data - Exception, Error ...
public function __construtc($data)
{
....
// $output - LogXmlOutput, LogHtmlOutput ...
$output->append($data)
}
}
class LogXmlOutput extends LogOutput {}
class LogHtmlOutput extends LogOutput {}
class LogOutput
{
public function append($data)
{
$nameMethod = "createOutputData";
if (($data instanceof Exception) || is_subclass_of($data, 'Exception')) {
$data = (ExceptionToLog)$data;
}
if (method_exists($data, $nameMethod))
{
$this->outputData = $data->createOutputData();
}
else
{
$dataClass = get_class($data);
throw new LogOutputException(_("Класс \"$dataClass\" не поддерживает метод \"$nameMethod\""));
}
}
}
// с оберткой
$w = new ExceptionWrapper;
$w->runWrapped(new SomeController);
// ручная обработка исключений
try{
$c = new SomeController;
$c->run();
}catch(Exception $e){
}catch ...
$l = new LogXmlOutput;
$w = new ExceptionWrapper;
$w->setLog($l); // любого типа лог!!!
...