Möchtest Du nicht eher in einer mit "set_error_handler" gesetzten Funktion für die Fehler/Warnungen/Notices passende Exceptions* werfen?!
*(ErrorException oder davon abgeleitet)
hi, danke für jeden Tipp ;)
In PHP ist das alles ein bischen komplizierter als in Perl.
Es soll in meinen Scripts die Möglichkeit geben:
- Warnungen in den Status einer Exception zu erheben (RaiseError),
- Exceptions mit oder ohne Backtrace werfen zu können.
Heute morgen hab ich das alles mal unter einen Hut gebracht, prinzipiell gibt es jetzt eine eigene Eception-Class, die von der PHP-Exception-Class erbt. Im Default ist der Backtrace eingeschaltet. Für den Fall, dass error_get_last() eine Exception werfen soll (quasi alle Warnungen, Notices...), kriegt meine Exception-Instanz den Backtrace von error_get_last().
Das alles zusammen sieht dann so aus:
<?php
error_reporting(NULL); // I have my own ...!!!
class MyBase{
public function __construct($cfg = array()){
$this->DBH = $this->dbh($cfg);
}
private function dbh(&$cfg = array()){
$default = array(
'user' => '',
'pass' => '',
'host' => 'localhost',
'port' => 3306,
'base' => 'myweb',
);
$cred = array_merge($default, $cfg);
$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 3);
mysqli_real_connect($mysqli, $cred['host'], $cred['user'], $cred['pass'], $cred['base']);
if($mysqli->connect_errno){
throw new MyException('Keine Verbindung', array('trace' => 0));
}
return $mysqli;
}
public function browse(){
$res = $this->DBH->query("SELECT url, id FROM perlbase ORDER BY title");
if(!$res) throw new MyException($this->DBH->error, array('trace' => 1));
while($r = mysqli_fetch_object($res)){
//print_r($r);
}
}
}
class MyException extends Exception{
public function __construct($message = '', $trace = array()){
$default = array(
'trace' => 1,
'file' => $this->getFile(),
'line' => $this->getLine(),
);
$this->TRACE = array_merge($default, $trace);
$this->MESSAGE = $message;
}
public function getMyMessage(){
if($this->TRACE['trace'] == 1){
return sprintf("%s at %s, line %u", $this->MESSAGE, $this->TRACE['file'], $this->TRACE['line']);
}
else{
return $this->MESSAGE;
}
}
}
///////////////////////////////////////////////////////////////////////////
// main class
// put out
try{
$mb = new MyBase;
$mb->browse();
$x .= 1; // Provoziere eine NOTICE
if(error_get_last()){
$eo = (object)error_get_last();
throw new MyException($eo->message, array('trace' => 1, 'file' => $eo->file, 'line' => $eo->line));
}
print "Alles ist gut gegangen\n";
}
catch(MyException $e){
printf("MyException: %s", $e->getMyMessage());
}
?>