Witam
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 (IMG:
http://forum.php.pl/style_emoticons/default/smile.gif)
A o to kod klasy:
<?php
define('EXCEPTION_CRITICAL', 1
); define('EXCEPTION_WARNING', 4
); define('EXCEPTION_NOTICE', 8
); define('EXCEPTION_DEBUG', 32
);
define("EXCEPTION_TARGET_DIR", "./logs"); define("EXCEPTION_LOGGING_LEVEL", EXCEPTION_DEBUG
); define("EXCEPTION_LENGTH_TYPE_STRING", 15
);
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->target_path=(defined("EXCEPTION_TARGET_DIR")?EXCEPTION_TARGET_DIR
:'.')."/"; $this->min_level=defined("EXCEPTION_LOGGING_LEVEL")?EXCEPTION_LOGGING_LEVEL
:EXCEPTION_ERROR
; $this->level=$level;
if(($file_handle=$this->file_handlers($this->target_file)) === false) {
$this->handled_file=fopen($this->target_path.$this->target_file, 'a'); $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();
$this->WriteMsg("Stack trace (".(sizeof($backtrace)+1)."):", EXCEPTION_DEBUG
); for($i=0; $i < sizeof($backtrace); $i++) { $args_str="";
foreach($backtrace[$i]['args'] AS $var) {
$args_str.=$this->getTypeAsString($var).", ";
}
$args_str=substr($args_str, 0
, -2
); $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);
fwrite($this->handled_file, "$timet$str_levelt$msgn"); }
}
}
final protected function file_handlers($file, $handle=null) {
if(isset($handlers[$file])) { return $handlers[$file];
} else {
return false;
}
} else {
if(isset($handlers[$file])) { 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"
);
return isset($list[$level])?
$list[$level]:"[unknown]"; }
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";
$val=(defined("EXCEPTION_LENGTH_TYPE_STRING") && strlen($var) > EXCEPTION_LENGTH_TYPE_STRING
)?
substr($var, 0, EXCEPTION_LENGTH_TYPE_STRING
)."[...]":$var; return "resource '".substr($val=strval($var), strrpos($val, "#")+1)."' of type '".get_resource_type
($var)."'"; $array_str="{ ";
foreach($var AS $key=>$val) {
$array_str.="[$key] => ".$this->getTypeAsString($val).", ";
}
$array_str=substr($array_str, 0, -2)." }"; return "array(".sizeof($var).") $array_str"; return "object of class '".get_class($var)."'";
} else {
return "unknown type '$var'";
}
}
final public function __destruct() {
}
}
}
?>
Pozdrawiam