 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
17.08.2008, 20:08
|
#1
|
|
TP-Senior
Registriert seit: Nov 2003
Ort: Graz
|
Exceptions
Hi!
hab mich jetzt intensiv mit PHP 5.0 und OOP auseinandergesetzt. dabei bin ich auf das thema exceptions gestoßen. grundsätzlich ist mir klar worum es dabei geht, allerdings ist mir das einsatz gebiet nicht ganz klar.
sollte man eventuelle fehlerquellen nicht schon vorher abfangen bzw was ist der vorteil wenn eine exception geworfen wird im gegensatz zu einer fehlermeldung des php-parsers?
habt ihr da irgendwelche links, literatur-tipps welche das thema exceptions anschaulich erklären? muss nicht unbedingt php spezifisch sein, auch die grundsätzliche überlegung dahinter würde mich interessieren.
danke schon mal im vorraus
lg
|
|
|
17.08.2008, 20:18
|
#2
|
|
TP-Veteran
Registriert seit: Nov 2006
Ort: Lübeck
|
Moin.
Zitat:
|
was ist der vorteil wenn eine exception geworfen wird im gegensatz zu einer fehlermeldung des php-parsers?
|
Das ist schnell beantwortet.
Auf Exceptions kann man selber reagieren. Das Skript bricht also nicht ab (wenn man es nicht will).
Und ja man kann alles vorher pruefen, aber ist das Pruefergebnis immer noch aktuell, wenn es zur tatsaechlichen Ausfuehrung kommt?
Bei PHP stelle ich mir das nun nicht so kritisch vor, aber bei einem Server-Client Programm mit Zugriffsrechten ist das schon kritischer.
Ausserdem ist es manchmal sehr bequem, wenn man auf einfach generell jede Exception abfangen kann.
http://de.wikipedia.org/wiki/Ausnahmebehandlung
|
|
|
17.08.2008, 20:28
|
#3
|
|
TP-Senior
Registriert seit: Nov 2003
Ort: Graz
|
danke für die schnelle antwort.
ich bin zum beispiel immer über ein beispiel mit einer division by zero exception gestoßen, das war dann meistens so etwas wie:
PHP-Code:
if($z2 == 0)
{
$error = 'Division durch 0 nicht möglich';
throw new Exception($error);
}
else
{
echo 'Ergebnis ist: '.$z1/$z2.'<br />';
}
da seh ich den sinn wirklich nicht ganz dahinter
Zitat:
Zitat von Guin
Und ja man kann alles vorher pruefen, aber ist das Pruefergebnis immer noch aktuell, wenn es zur tatsaechlichen Ausfuehrung kommt?
|
da stellt sich dann noch eine frag für mich, wie weiß ich wo es eventuell zu einer exception kommen könnte und wo nicht? sprich, wie weiß ich bei welchem code-stück ich eine exception sinnvoll einsetzen kann und wo ich sie nicht brauche
|
|
|
17.08.2008, 22:02
|
#4
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
auf die schnelle ist das hier die seite gewesen, wo man die logik rel. gut sehen kann
|
|
|
17.08.2008, 23:50
|
#5
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von skaterpunk001
da stellt sich dann noch eine frag für mich, wie weiß ich wo es eventuell zu einer exception kommen könnte und wo nicht? sprich, wie weiß ich bei welchem code-stück ich eine exception sinnvoll einsetzen kann und wo ich sie nicht brauche
|
Wie bereits im Link von theo steht. Überall wo Fehler (und daraus resultierende Folgefehler) auftreten können, setzt man den Code in einen try/catch Block um den Fehler zu fangen. Die Beispiele die man oft findet sind IMO saudumm gewählt, weil sie den Bezug zur Realität vermissen lassen und/oder total theoretischer Natur sind.
Ein sinnvoller Einsatz wäre z.B., wenn man das Öffnen einer Datenbankverbindung in einen try/catch Block setzt. So kann man unerwartete Fehler abfangen (z.B. Datenbankserver down, bereits zu viele Verbindungen geöffnet, etc.) und die Ausführung von nachfolgenden DB-Operationen verhindern. Hier ein Beispiel wie ich es in meinem Gästebuch verwende:
PHP-Code:
public function __construct()
{
try
{
// Datenbank-Verbindung
if(!$this->connectID = @mysql_connect( __DBHOST__, __DBUSER__, __DBPASS__ ))
{
throw new Exception( '', 1 );
}
if (!$this->dbselect = @mysql_select_db( __DBNAME__, $this->connectID ))
{
throw new Exception( '', 2 );
}
}
catch (Exception $error)
{
switch ($error->getCode())
{
// Datenbank-Verbindung Fehler
case '1':
echo '<h3 style="color: red; font-weight: bold;">Hinweis:</h3>';
echo '<p>Beim Versuch eine Verbindung zum Datenbankserver aufzubauen trat leider ein Fehler auf.<br />';
echo 'Eine mögliche Ursache könnte sein das momentan Wartungsarbeiten am Server ausgeführt werden.<br />';
echo 'Bitte versuchen Sie es in einigen Minuten erneut. Sollte dieses Problem permanent auftreten kontaktieren<br />';
echo 'Sie bitte den Webmaster dieser Seite, damit dieses Problem schnellstmöglich behoben werden kann.</p>';
echo '<p>Wir bedanken uns für Ihre Kooperation und entschuldigen die Unannehmlichkeiten.</p>';
exit;
break;
// Tabellen-Auswahl Fehler
case '2':
echo '<h3 style="color: red; font-weight: bold;">Hinweis:</h3>';
echo '<p>Beim Auswahlversuch der Gästebuchtabelle meldete der Datenbankserver einen Fehler.<br />';
echo 'Probleme dieser Art sind für gewöhnlich nur temporär und sehr kurzweilig.<br />';
echo 'Bitte versuchen Sie es in einigen Minuten erneut. Sollte dieses Problem permanent auftreten kontaktieren<br />';
echo 'Sie bitte den Webmaster dieser Seite, damit dieses Problem schnellstmöglich behoben werden kann.</p>';
echo '<p>Wir bedanken uns für Ihre Kooperation und entschuldigen die Unannehmlichkeiten.</p>';
exit;
break;
}
}
}
Es wird also versucht eine DB-Verbindung zu öffnen. Wurde der Server nicht kontaktiert, wird ein Fehler geworfen und das Auswählen der Datenbank wird übersprungen. Würde ja keinen Sinn machen eine DB zu wählen, wenn man nicht mit dem Server verbunden ist. Wurde die Verbindung hergestellt, wird versucht die Datenbank auszuwählen - auch hier wird wieder eine Exception geworfen, falls die Datenbank nicht ausgewählt werden kann. Denn dann würde es im weiteren Verlauf keinen Sinn machen Queries an die DB zu schicken.
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
18.08.2008, 02:41
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
schönes Beispiel.
Anhand Deines Beispieles würde ich noch weitergehen und aussagekräftige Konstanten definieren (hier Klassenkonstanten)
PHP-Code:
const DB_CONNECTION_ERROR = 1; const DB_TABLESELECT_ERROR = 2;
Das erhöht die Lesbarkeit von Code, vor allem wenn die Texte in lang-Dateien ausgelagert sind.
BTW: ein kleines Meisterstück macht diese Zeile, gefunden in den docs. Sie konvertiert Notices and Errors to exceptions
PHP-Code:
set_error_handler(create_function('$x, $y', 'throw new Exception($y, $x);'), E_ALL & ~E_NOTICE);
|
|
|
18.08.2008, 04:24
|
#7
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Hallo Steffen,
vollkommen richtig was Du sagst, zumal ich im Verlauf der Klasse noch weitere Exceptions werfe, die alle durchnumeriert sind. Zu meiner Verteidigung (um nicht zu sagen Ausrede  ) muß ich aber sagen, dass der Schnipsel oben aus meinen ersten Gehversuchen mit Exceptions herrührt. Da war das alles noch etwas holprig.
Der Hinweis auf das "Meisterwerk" ist aber wirklich sehr elegent. Das temporäre Erzeugen von Funktionen hatten wir hier ja schon öften und das waren eigentlich immer Perlen. Danke für den Hinweis!
Nochmal zum Thema Exceptions allgemein...
In einem anderen freien Script an dem ich so nebenher doktere (oops, war das ein Spoiler?! ) werden Exceptions etwas intensiver benutzt. Hier mal eine stark gekürzte Fassung, wie man eine eigene Exception Klasse anlegt und diese zur Laufzeit auch sinnvoll nutzen kann.
Inhalt von BildFehler.class.php
PHP-Code:
class BildFehler extends Exception { const FEHLER_KEINE_BILDDATEI = 'Die Datei ist kein gültiges Bild!'; const FEHLER_BILD_RESOURCE = 'Das Bild konnte nicht geladen werden!'; const FEHLER_KEIN_WASSERZEICHEN = 'Die Wasserzeichengrafik konnte nicht gefunden werden!'; const FEHLER_FONT_LADEN = 'Die Schriftart für das Wasserzeichen konnte nicht geladen werden!';
// Konstruktor public function __construct( $meldung, $code = 0 ) { parent::__construct( $meldung, $code ); } }
Inhalt von Bild.class.php
PHP-Code:
class Bild { protected $BildTyp = '';
// Konstruktor public function __construct( $Bild ) { $tmpInfo = getimagesize( $Bild ); switch ($tmpInfo[2]) { case '1': $this->BildTyp = 'GIF'; break; case '2': $this->BildTyp = 'JPG'; break; case '3': $this->BildTyp = 'PNG'; break; default : throw new BildFehler( BildFehler::FEHLER_KEINE_BILDDATEI ); break; } } }
Inhalt von wizard.php
PHP-Code:
error_reporting( 0 ); header( 'Content-Type: text/html; charset=utf-8' );
// Klassen nachladen function __autoload( $klasse ) { if (file_exists( './lib/' .$klasse . '.class.php' )) { require_once( './lib/' .$klasse . '.class.php' ); } }
//Anwendungsbeispiel try { $bild = new Bild( "./bilder/testbild.jpg" ); } catch (BildFehler $error) { echo $error->getMessage(); }
Existiert nun testbild.jpg nicht oder gibt man eine Datei an, die nicht jpg, gif oder png ist, wird "Die Datei ist kein gültiges Bild!" ausgegeben.
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
23.08.2008, 10:44
|
#8
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
Hallo Rizzo,
ich wollte mich kurz für das angenehme Lesen Deines Codes bedanken. 
Nein ehrlich, es gibt so viele schlecht strukturierte und schlecht lesbare Code-Fragmente hier im Netz, dass Deine Werke da immer angenehm hervorstechen, da sie gut durchdacht, sauber strukturiert und dadurch angenehm lesbar sind. Aus meiner Sicht baust Du Deinen Code nach best-practices auf und schaffst Dir hervorragend wartbare Klassen. Das kann man ruhig mal erwähnen, dass Du PHP auf hohem Niveau ganz im Sinne von Zend anwendest.
Ich finde das bewundernswert und weiß, dass es in der hektischen Praxis oft nicht leicht ist, sich an alle Ideale zu erinnern und diese konsequent umzusetzen. An Deinen Beispielen können sich viele, auch erfahrene PHP-Programmierer noch eine Scheibe abschneiden. Das Du Dein know-how auch noch so uneigennützig hier im Forum und auf Deiner Seite mitteilst, ist einfach super. Mach weiter so!
So, das musste mal raus. Auch wenn das offtopic war. 
|
|
|
23.08.2008, 11:18
|
#9
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von DSB
Hallo Rizzo,
ich wollte mich kurz für das angenehme Lesen Deines Codes bedanken. 
Nein ehrlich, es gibt so viele schlecht strukturierte und schlecht lesbare Code-Fragmente hier im Netz, dass Deine Werke da immer angenehm hervorstechen, da sie gut durchdacht, sauber strukturiert und dadurch angenehm lesbar sind. Aus meiner Sicht baust Du Deinen Code nach best-practices auf und schaffst Dir hervorragend wartbare Klassen. Das kann man ruhig mal erwähnen, dass Du PHP auf hohem Niveau ganz im Sinne von Zend anwendest.
Ich finde das bewundernswert und weiß, dass es in der hektischen Praxis oft nicht leicht ist, sich an alle Ideale zu erinnern und diese konsequent umzusetzen. An Deinen Beispielen können sich viele, auch erfahrene PHP-Programmierer noch eine Scheibe abschneiden. Das Du Dein know-how auch noch so uneigennützig hier im Forum und auf Deiner Seite mitteilst, ist einfach super. Mach weiter so!
So, das musste mal raus. Auch wenn das offtopic war. 
|
Hallo Daniel,
vielen Dank für die Blumen! Das treibt mir ja fast die Schamesröte in's Gesicht.
Das Kompliment bedeutet mir umsomehr, weil es von einem der wenigen echten Profis kommt, die sich hier im TP herumtreiben!
Vielen Dank und beste Grüße,
Andreas
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 08:03 Uhr.
|
 |