Napisalem klase do obslugi wyjątków, która przechwycone komunikaty, kod błędu i ślad wywołań zapisuje do pliku.
Prosiłbym o komentarze, co możnaby zrobić lepiej, co zmienić, itp. jakiejś dodatkowej funkcjonalności raczej nie przewiduje, chyba, że bedzie to naprawdę ciekawy pomysł.
Porad chciałbym zasięgnąć od doświadczonych programistów

A o to kod klasy:
<?php class LoggedException extends Exception { protected $message="Unknown exception"; protected $target_file="exc_main.txt"; protected $target_path; protected $handled_file; protected $min_level; protected $level; public function __construct($message=null, $level=EXCEPTION_ERROR, $code=null) { parent::__construct($message, $code); $this->level=$level; if(($file_handle=$this->file_handlers($this->target_file)) === false) { $this->file_handlers($this->target_file, $this->handled_file); } else { $this->handled_file=$file_handle; } $this->WriteMsg("Exception '".get_class($this)."' with message '$this->message (code: $this->code)' in $this->file($this->line)", $this->level); if(EXCEPTION_DEBUG <= $this->min_level) { $backtrace=$this->getTrace(); $args_str=""; foreach($backtrace[$i]['args'] AS $var) { $args_str.=$this->getTypeAsString($var).", "; } $this->WriteMsg("#$i ".$backtrace[$i]['file']."(".$backtrace[$i]['line']."): ".$backtrace[$i]['class'].$backtrace[$i]['type'].$backtrace[$i]['function']."($args_str)", EXCEPTION_DEBUG); } $this->WriteMsg("#$i {main}", EXCEPTION_DEBUG); } } } final protected function WriteMsg($msg, $level=EXCEPTION_INFO) { if($level <= $this->min_level) { $str_level=$this->LevelToString($level); } } } final protected function file_handlers($file, $handle=null) { return $handlers[$file]; } else { return false; } } else { return false; } else { $handlers[$file]=$handle; return true; } } } final public function getLevel() { return $this->level; } final public function getLevelAsString() { return $this->LevelToString($this->level); } final protected function LevelToString($level) { EXCEPTION_CRITICAL => "EXCEPTION_CRITICAL", EXCEPTION_ERROR => "EXCEPTION_ERROR", EXCEPTION_WARNING => "EXCEPTION_WARNING", EXCEPTION_NOTICE => "EXCEPTION_NOTICE", EXCEPTION_INFO => "EXCEPTION_INFO", EXCEPTION_DEBUG => "EXCEPTION_DEBUG" ); } final protected function getTypeAsString($var) { return "bool(".($var===true?"true":"false").")"; return "int($var)"; return "float($var)"; return "double($var)"; return "real($var)"; return "NULL"; return "string(".strlen($var).") '".str_replace("t", "t", str_replace(array("rn", "n", "r"), "n", $val))."'"; $array_str="{ "; foreach($var AS $key=>$val) { $array_str.="[$key] => ".$this->getTypeAsString($val).", "; } return "object of class '".get_class($var)."'"; } else { return "unknown type '$var'"; } } final public function __destruct() { } } } ?>
Pozdrawiam