hotti: Warnungen und Notizen in den Status einer Exception erheben

Beitrag lesen

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());  
}  
  
?>