getreidemuehlen
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 17.08.2008, 20:08   #1
TP-Senior
 
Registriert seit: Nov 2003
Ort: Graz
skaterpunk001 ist auf einem guten Weg

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
skaterpunk001 ist offline   Mit Zitat antworten


Alt 17.08.2008, 20:18   #2
TP-Veteran
 
Benutzerbild von Guin
 
Registriert seit: Nov 2006
Ort: Lübeck
Guin hilft, wo's gehtGuin hilft, wo's gehtGuin hilft, wo's geht
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
Guin ist offline   Mit Zitat antworten
Alt 17.08.2008, 20:28   #3
TP-Senior
 
Registriert seit: Nov 2003
Ort: Graz
skaterpunk001 ist auf einem guten Weg
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 Beitrag anzeigen
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
skaterpunk001 ist offline   Mit Zitat antworten
Alt 17.08.2008, 22:02   #4
TP-Specialist
 
Benutzerbild von theo
 
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
theo bringt sich richtig ein
auf die schnelle ist das hier die seite gewesen, wo man die logik rel. gut sehen kann
theo ist offline   Mit Zitat antworten
Alt 17.08.2008, 23:50   #5
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von skaterpunk001 Beitrag anzeigen
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'');
            }
            if (!
$this->dbselect = @mysql_select_db__DBNAME__$this->connectID ))
            {
                throw new 
Exception'');
            }
        }
        
        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&ouml;gliche Ursache k&ouml;nnte sein das momentan Wartungsarbeiten am Server ausgef&uuml;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&ouml;glich behoben werden kann.</p>';
                    echo 
'<p>Wir bedanken uns f&uuml;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&auml;stebuchtabelle meldete der Datenbankserver einen Fehler.<br />';
                    echo 
'Probleme dieser Art sind f&uuml;r gew&ouml;hnlich nur tempor&auml;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&ouml;glich behoben werden kann.</p>';
                    echo 
'<p>Wir bedanken uns f&uuml;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.
Rizzo ist offline   Mit Zitat antworten
Alt 18.08.2008, 02:41   #6
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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); 
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 18.08.2008, 04:24   #7
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
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 )
    {
        
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 
BildFehlerBildFehler::FEHLER_KEINE_BILDDATEI ); break;
        }
    }


Inhalt von wizard.php
PHP-Code:
error_reporting);
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.
Rizzo ist offline   Mit Zitat antworten
Alt 23.08.2008, 10:44   #8
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
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.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 23.08.2008, 11:18   #9
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von DSB Beitrag anzeigen
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
Rizzo ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
Exceptions [PHP] Exceptions
« Auskommentieren, bitte Hilfe | Email versenden mit XAMPP? »

Stichworte
exceptions, fehler, oop, php

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:03 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42