Einfache Exception-Implementierung

rellek

relativ sensationell
Teammitglied
Hallöchen,

also ich bastel grad was... Und dabei fiel mir auf, dass OOP wohl ein paar kleine Vorteile haben könnte.

Und da dacht ich nun, wenns schon OOP wird, dann will ich auch mit Exceptions werfen. :D

Das kenne ich nun nur aus Java und da wirft man einfach, weil das ganze Konstrukt rund herum schon drauf vorbereitet ist. In PHP ist das nun aber anders.

Also, ich möchte gerne dass jeglicher Fehler als Exception gebracht wird. Also auch so PHP-Fehler, wie sie etwa entstehen, wenn eine Datei nicht komplett hochgeladen wurde.

Wie muss ich das anstellen? Kann mir da umständehalber jemand ein paar Zeilen an den Kopf werfen?

Das wäre sehr nett :)
 

DodoMedia

Member

rellek

relativ sensationell
Teammitglied
Nja was ich am Ende erreichen möchte, ist, dass der User IMMER eine gescheite Seite zu sehen bekommt (und ich einen Eintrag in einem Logfile und wenn auch das nicht geht, dann eine Mail). Schlimmstenfalls sowas wie "Twitter is over capacity" :D

Weiss nicht, was der bei dir nicht gefangen hat, aber möglich wärs, dass man das Error-Reporting auf richtig scharf stellen müsste, damit er alles frisst. Aber ich werd mal sehen...
 

rellek

relativ sensationell
Teammitglied
OK, andere Frage. :D

Fatal error: Exception thrown without a stack frame in Unknown on line 0
Wieso?

Test-Exception:
PHP:
if(1 == 1) throw new CMSException('Test');

Fehlerumleitung:
PHP:
// Exceptions are redirected to our own handler
set_exception_handler(array('ENGINE', 'exception'));

// And PHP-errors as well
set_error_handler(array('ENGINE', 'error'), E_ALL);

ENGINE::error():
PHP:
	public static final function error($no, $message, $filename, $line) { 
		//if(error_reporting()) {
		/*	switch($no) {
				case E_ERROR:
					throw new PHPErrorException('PHP-Error in '.$filename.' ('.$line.'): '.$message);
					break;
					
				case E_WARNING:
					throw new PHPWarningException('PHP-Warning in '.$filename.' ('.$line.'): '.$message);
					break;
				
				case E_PARSE:
					throw new PHPParseErrorException('PHP-Parse-Error in '.$filename.' ('.$line.'): '.$message);
					break;
					
				case E_NOTICE:
					throw new PHPNoticeException('PHP-Notice in '.$filename.' ('.$line.'): '.$message);
					break;
					
				default:*/
					throw new PHPMiscErrorException('PHP-Misc. Error in '.$filename.' ('.$line.'): '.$message);
					/*break;
			}*/
		//}
	}

ENGINE::exception():
PHP:
	public static final function exception(Exception $e) {
		if($e instanceof CMSException) {
			$e->show();
			exit;
		}
		
		print $e;
		exit;
	}

Last, but not least, CMSException:
PHP:
<?php

class CMSException extends Exception {
	const ERRORFILE = "cmsexception.htm";
	const TYPE = "CMS Exception";
	const DESC = "No description available.";
	
	public function __construct($message, $code = 0) {
		parent::__construct($message, $code);
	}

	public function show() {
		if(_DEVMODE_) {
			// Exception output
			?><html>
			<head>
			<title>Houton, weve got a problem!</title>
			</head>
			
			<body>
			Exception occured:

			[b]<?php echo TYPE; ?>[/b]

			<?php echo DESC; ?>


			Message:
			<?php htmlentities($this->getMessage()); ?>

			File:
			<?php htmlentities($this->getFile()); ?> (<?php $this->getLine(); ?>)
			
			Stacktrace:

			<?php echo htmlentities($this->getTraceAsString()); ?>



			Over and out!
			
			</body></html>
			
			<?php
			
			
		} else {
			// Nice error page for people
			require(_DIR_."core/exceptions/output/".ERRORFILE);
			
		}
	}
}
?>
 

Chance

Member
Lol 8o :D .
Ist nur, weil der Fehler hat mich gestern den ganzen Tag beschäftigt...

Er ist aufgetreten, weil im destructor / exeption eine weitere exeption ausgelöst wurde.
 

rellek

relativ sensationell
Teammitglied
Das heisst, der Fehler, den ich habe, muss ich in der Exception suchen? Weil Destructor habe ich keinen.

Hm, mal sehen. Sah aber soweit ok aus, grml.
 

Chance

Member
Hmmm... ist nicht das beenden durch einen Fehler bzw. das Abfangen eines fehlers nicht auch sowas wie ein destructor ?
 

rellek

relativ sensationell
Teammitglied
Wenn das so wäre, gingen Exceptions in PHP ja nie.

Abfangen eines Fehlers (du meinst einen catch()-Block?) kann zudem kein Destructor sein, weil dann gehts ja normal weiter. Oder nicht?
 

rellek

relativ sensationell
Teammitglied
Ach Gottchen,

ja bei mir auch.
Es hätte self::TYPE heissen müssen.

Buah!

Ok, danke für die Hilfe :)
 
Oben