php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 15.02.2011, 19:50  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard Fehlermeldungen und Fehlercodes, Konzept?

Sers

Ich bastel mir gerade eine Klasse welche über set_error_handler und set_exception_handler eine standardmäßige Fehlerbehandlung und Debugfunktionen liefern soll (z.B. kontrollierte Ausgabe von Notices und Warnings anstatt am Seitenanfang etc.) sodas man in einem produktiven System das error_reporting anschalten kann ohne gleich alles zu zerstören.

Die Klasse steht, doch bevor ich nun weitermache bin ich am überlegen wie ich Fehlertypen, Fehlermeldungen und Fehlercodes am gescheitesten organisiere.

Dazu hab ich im Netz leider nicht viel finden können deswegen frage ich hier.

Zunächst gilt es ja Fehler in Typen zu klassifizieren.

Notice - Fehler die den Programmablauf nicht beeinträchtigen aber ggf. zu unerwünschten Resultaten führne können
Warning - Fehler welche eine Funktion/Methode zum Abbruch zwingen, Programm/Script kann weiter ausgeführt werden
Exception - Fehler welche das Programm/Script zum Abbruch zwingen wenn sie nicht behandelt werden können
Error - Fehler die nicht behandelbar sind und das Programm/Script stoppen

Kann man das als Klassifizierung so stehen lassen?

Weiter geht es mit der Organisation von Fehlercodes und -meldungen.

Die Fehlermeldungen direkt in den Code zu schreiben halte ich generell für eine schlechte Idee da sie dann schlecht wartbar/korrigierbar sind. Also Dinge a la:

PHP-Code:
trigger_error('shit happens!'); 
Ich habe bloß keine Idee wie ich das zentral gut verwalten kann, sodas man im Code dennoch erkennt um welchen Fehler es sich handelt.

Ich suche also etwas a la:

PHP-Code:
define('SHIT_ERROR''shit happens!');
trigger_error(SHIT_ERROR); 
Die Liste an Konstanten wäre bloß auf die Dauer ziemlich lang. Das gleiche gilt für Fehlercodes. Fakt ist aber das die Meldungen ja eh irgendwo niedergeschrieben werden müssen. Nur wie und wo?

Davon abgesehen sollte ja auch irgendwo aufgenommen werden um welche Komponente es sich handelt (System, View, Database, Registry, Modul etc.) die den Fehler ausgelöst hat.

Wie organisiert ihr sowas? Nach welchen Konzepten geht ihr da vor oder habt ggf. Lektüre für mich die gängige Konzepte erleutert?

Wie gesagt, meine Googlesuche war nicht wirklich aufschlussreich deswegen frage ich euch (ich weise darauf hin weil ich die Forumsrichtlinien zu Inseraten, Ideen, Meinungsumfragen kenne ).
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.02.2011, 20:23  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

Zitat:
sodas man in einem produktiven System das error_reporting anschalten kann ohne gleich alles zu zerstören
Das error_reporting() ist da eigentlich nicht ausschlaggebend, vielmehr die Option "log_errors" und "display_errors". Da musst du nicht selbst einen Wrapper für schreiben!

trigger_error() würde ich grundsätzlich nicht mehr benutzen, stattdessen lieber eine Exception werfen, die du dann an entsprechender Stelle fangen kannst. Ich biege bspw. mit set_error_handler() alle Fehler auf eine ErrorException um, so dass ich wirklich alles fangen kann, was zu fangen ist. Konstanten als Fehlermeldungen zu verwenden finde ich auch keine gute Idee, hat sich zumindest nicht als praktikabel erwiesen. Einfach englischen Kurztext tippen und vor der Ausgabe (falls du die Exception nicht fängst) einfach übersetzen (Array-Mapping oder wie dein Übersetzungsmodul funktioniert, falls du eines hast) oder im Produktivsystem sowieso durch eine deutsche Standardfloskel ersetzen. Exceptions sollten sowieso nicht bis zum Benutzer stossen, daher kann es - meiner Meinung nach - da auch ruhig technisch und englisch zur Sache gehen. Als Identifier für die Art der Exception benutze ich schändlicherweise die HTTP-Codes: 403, wenn die ACL deny meldet, 404 wenn ein Model nichts findet oder 500 bei anderen Sachen.

Lies dich doch mal ins Exception-Handling ein.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 15.02.2011, 20:37  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Da die Fehlermeldungen den Benutzer nichts angehen handhabe ich das so wie Chriz - ich schreib das rein, was _mich_ an der Stelle interessiert.
Über das ErrorReporting/Exceptions sammle ich mir dann noch notwendige Infos, schreib die in meine Log und zeig dem Benutzer "Es ist ein Fehler aufgetreten".
Schließlich muss man ja nicht alles verkomplizieren - und sauberes Englisch sollte jeder verstehen, der sich mit ErrorLogs beschäftigen und am Script werkeln muss.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 15.02.2011, 21:05  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Mit Exceptionhandling kenne ich mich aus, auch aus anderen Programmiersprachen.

Die Wrapperklasse ist - teilweiße - notwendig wenn ich mal überlege wie es bei uns in der Firma zugeht. Da werden dann Bedingungen gebastelt welche das error_reporting und display_errors nur für unsere IP hochschrauben weil wenn du jemanden fragst "sag mir mal wo ich auf server xxx die php error logs finde" gibts nur ein "hääää?".

Bei uns Livesysteme zu debuggen ist ein Graus. Daher die Wrapperklasse denn falls mein Stückchen Software doch mal meinen Rechner verlässt soll wenigstens die Möglichkeit vorhanden sein.

Was die Meldungen und Codes an sich angeht: Ich liebäugel gerade schon wieder mit XML als Ablageformat. Ist mit simpleXML schnell eingebaut und in viele Richtungen erweiterbar.

Nur das Konzept ist mir noch unklar über die Anordnung des ganzen.

VN0001 - "View Notice Nr. 1"
VW0001 - "View Warning Nr. 1"

Oder sollten Fehlercodes prinzipiell nur Zahlen beinhalten? Bei Exceptions ist es ja relativ einfach eine Komponente zuzuordnen da man i.d.R. für jeden Exceptiontyp eine eigene Klasse von Exception erben lässt.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 15.02.2011, 21:29  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Dann testet besser. Ich glaube ich verstehe aber nicht so ganz was du vor hast, was willst du mit XML anfangen?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 16.02.2011, 00:53  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Dann testet besser. Ich glaube ich verstehe aber nicht so ganz was du vor hast, was willst du mit XML anfangen?
Mir geht es gerade hauptsählich um folgende Dinge:

- Strukturierung der Fehlercodes+Fehlermeldungen (Codes als laufende Nummer oder "anders"?)
- Flexible Speicherung der Fehlercodes+Meldungen (XML ist da am einfachsten zu Erweitern)
- Zugriff über einen Schlüssel welcher den Inhalt der Meldung erkennbar widerspiegelt
- Einbindung in das System (Ggf. ein Singleton zum Abruf? oder nur eine statische Methode im Wrapper?)

Besser testen lässt sich nicht durchsetzen, schon versucht. Davon ab das ich davon ausgehe das das es bei vielen Entwicklern so ausschaut.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 16.02.2011, 06:37  
Neuer Benutzer
 
Registriert seit: 15.02.2011
Beiträge: 1
PHP-Kenntnisse:
Fortgeschritten
tomtom67 befindet sich auf einem aufstrebenden Ast
Standard

Hi,

wenn du auf Fehlercode stehst: Als eindeutiger Bezeichner eignet sich Dateipfad und Zeilennummer. Das lässt sich auch prima automatisieren

Fehlermeldungen in meinen Projekten werden grundsätzlich per Mail verschickt und in einem Logfile gespeichert. Dabei enthält jede Meldung:
- einen Titel (z.B. Exception-Message). Dieser muss (für dich) klar und verständlich ausdrücken, was schief gelaufen ist. Also nicht "Scheisse, geht nicht", sondern "Benutzer nicht eingeloggt: Mehr als ein Datensatz passte"
- ein komplettes Backtrace (Skalar-und Array-Argumente mit Inhalt, bei Objekten nur Objekttyp)
- eine (leicht gefilterte) Liste der globalen Variablen
- oder, wenn Zend Framework zum Einsatz kommt, GET, POST, COOKIE, SESSION und SERVER
- Zusätzlich noch ein paar wichtige Variablen deiner Applikation.

Die Signatur meiner Funktion:
ReportAppError(string $title, Exception $ex, ...)
Sämtliche Argumente hinter $ex werden per print_r($x, true) an die Meldung angehängt.


Hoffe das hilft - ist zumindest die Essenz von > 10 Jahren PHP Entwicklung.


Grüße
Thomas
tomtom67 ist offline   Mit Zitat antworten
Alt 16.02.2011, 19:14  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Nun, folgendes werde ich nun wohl umsetzen:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE errorSpec PUBLIC "-//Thryme CMS//Error Specification//EN" "../../dtd/errorSpec.dtd">
<errorSpec>
    <notices>
        <notice access="SY_NTC_APP_NAME" class="System" method="initialize" code="SY-000001" message="Application name not found, loading default Application '%S'" />
    </notices>

    <warnings>
        <warning access="SY_WNG_QRY_STRING" class="System" method="initialize" code="SY-000010" message="Querystring was empty." />
    </warnings>

    <errors>
        <error access="SY_ERR_EMPTY_EXT_LIST" class="System" method="initialize" code="SY-000020" message="No system class extensions could be found." />
        <error access="SY_ERR_INV_EXTENSION"  class="System" method="loadExtension" code="SY-000021" message="Invalid extension class name '%S'." />
    </errors>
</errorSpec>
Beispiel XML zur Ablage der Meldungen vom System. Die Trennung in verschiedene Dateien je nach Komponente ermöglicht es mir die Listen kurz zu halten und problemlos dynamisch (bei der installation eines Moduls beispielsweiße) weitere Meldungen hinzuzufügen.

Geladen wird das ganze wie folgt:
PHP-Code:
$e ErrorManager::getInstance();
$e->setErrorSpecificationDirectory('../../debug/err_spec/'); // wird nur einmal in der bootstrap Datei ausgeführt.
$e->addErrorSpecification('system.xml'); 
Geworfen wird das ganze durch eine Funktion ähnlich trigger_error welche ledeglich den in access definierten Wert benötigt und die korrekte Anzahl an Parametern für die Meldung und dies an den ErrorManager durchschleift.

Für Exceptions lege ich eine Klasse an welche mit den gleichen Parametern wie meine Funktion auskommt damit der Aufruf von "throw new" möglich bleibt und diese noich gefangen werden können.

Kann man damit Leben?
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 16.02.2011, 19:19  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich halte sowas für unpraktikabel und praxisfern. Fehler sollten beseitigt werden, nicht kunstvoll geloggt. Zudem sind nur ein Teil von in PHP möglichen Fehlerklassen abzufangen (andere nur mit sehr viel FooBar). Ich würde zu Exceptions und einfachen Logfiles raten.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 16.02.2011, 19:35  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Ich halte sowas für unpraktikabel und praxisfern. Fehler sollten beseitigt werden, nicht kunstvoll geloggt..
Es geht ja nicht um kunstvoll sondern um eine möglichst aussagekräftige Fehlerbehandlung die den Zweck erfüllt den Entwickler mit mehr Informationen als nur einer Zeilennummer zu versorgen (das macht u.A. meine Wrapperklasse welche die Fehler sammelt und loggt) und gleichzeitig dafür zu sorgen das die Anwendung nicht wegen jedem Furz (Es wurde ein String anstatt eines Integers übergeben - warum auch immer) abbricht und der Besucher nur noch weiss sieht mit "Es ist ein Fehler aufgetreten".

An unserer Firma sehe ich was passiert wnen eine vernünftige Fehlerbehandlung fehlt und sich auf display_errors verlassen wird. Dem will ich entgegen wirken.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Framework Kernel Konzept Geryon Software-Design 36 06.10.2010 22:23
Konzept einer Datenbankabstraktion Dark Guardian Software-Design 29 30.01.2010 18:13
[Erledigt] Konzept für einen PHP Web Crawler Dark Guardian Software-Design 10 23.11.2009 16:31
Konzept für Bowsergame Wiillli Beitragsarchiv 1 21.10.2009 15:18
kleines DB Konzept Tomte Datenbanken 21 23.08.2008 10:22
Fehlermeldungen FBI PHP Tipps 2005-2 12 21.10.2005 16:08
Keine Fehlermeldungen bei Objektzugriff PHP Tipps 2005-2 1 20.09.2005 12:45
Konzept GFX-Community PHP Tipps 2005-2 2 22.08.2005 10:22
keine Fehlermeldungen Michel PHP Tipps 2005-2 3 18.08.2005 18:11
Fehlermeldungen trotz error_reporting(0) PHP Tipps 2005-2 9 10.07.2005 16:34
mehr Fehlermeldungen micbur PHP Tipps 2005 2 27.05.2005 13:18
Keine Fehlermeldungen suter PHP Tipps 2005 2 27.01.2005 09:56
Formular Fehlermeldungen Mano PHP Tipps 2005 27 23.01.2005 20:03
Fehlermeldungen mit Switch-Abfrage für $_GET['section'] PHP-Fortgeschrittene 9 22.09.2004 23:59

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
application load error 5:00, softwaredesign fehlerbehandlung fehlercodes, schlechte error meldungen, konzept fehlerbehandlung, fehlerbehandlung konzept, konzept fehlerbehandlung script, php keine fehlermeldungen, fehlerseiten ala php, fehlercodes konzept, set_exception_handler notice, fehlermeldung konzept, fehlerhandling konzept, php fehlerklasse, message konzept php, php fehlerbehandlung, application load error 5:00 deutsch, konzepte fehlerhandling in code, konzept fehlercodes exceptions, php error handling anschalten, 500 - ein fehler ist aufgetreten! db function reports no errors

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum