php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-10-2007, 22:44
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard Wrapper für trigger_error

Hallo zusammen,

in meiner Anwendung habe ich ein eigenes Exception-Handling. Mit trigger_error() funktioniert das auch alles wunderbar. Jetzt möchte ich aber nicht trigger_error aufrufen sondern $app->throwException(). In dieser Methode würde dann erst trigger_error() gestartet. Das Problem ist, dass errorLine und errorFile IMMER die Stelle angeben, an der trigger_Error aufegerufen wurde und nicht, wo throwException gestartet wurde. Ist ja auch logisch, aber wie kann ich das umgehen? Also dass in den Parametern meines eigenen ExceptionHandlers richtige Werte für $errorLine und $errorFile stehen?

DANKE!

strauberry
Mit Zitat antworten
  #2 (permalink)  
Alt 17-10-2007, 23:02
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Also dass in den Parametern meines eigenen ExceptionHandlers richtige Werte für $errorLine und $errorFile stehen?
Und wenn du
PHP-Code:
$app->throwException(debug_backtrace()); 
machst?
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #3 (permalink)  
Alt 17-10-2007, 23:47
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Also wenn schon, dann doch eher so:
PHP-Code:
$app->throwException('Example error'E_USER_ERROR);

class 
app {
    public function 
throwException($err_msg$err_type) {
        
$trace debug_backtrace();
        
trigger_error($err_msg$err_type);
    }

Das siehst du auch schon, wo der Hase im Pfeffer liegt:
trigger_error() wird in app::throwException() aufgerufen und die PHP-Fehlermeldung wird immer die Stelle des Calls referenzieren. Im obigen Codesample wäre das Zeile 6.
Es gibt keine Möglichkeit, die Zeilennummer aus $trace an trigger_error() weiterzugeben.

Mußt du eigentlich für PHP <5 entwickeln oder warum willst du nicht wirklich Exceptions werfen?
Mit Zitat antworten
  #4 (permalink)  
Alt 18-10-2007, 00:02
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Aber er will doch die Zeile
Zitat:
wo throwException gestartet wurde
Und die müsste doch in debug_backtrace() beim Aufruf der Methode throwException enthalten sein. Oder irre ich mich da?
Zitat:
warum willst du nicht wirklich Exceptions werfen?
Das wäre sicherlich die sauberste Lösung...

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #5 (permalink)  
Alt 18-10-2007, 00:03
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielen Dank schon mal für die Tipps!

Ich entwickel auf PHP 5. Keine "richtigen" Exceptions schmeißen, hmmm. Ich überleg momentan sowieso, wieso ich das mit dem trigger_error mache. Denn in meinem eigenen ExceptionHandler rufe ich dann auch wieder eigene Methoden auf. DIe könnte ich doch auch direkt aufrufen, wenn es eine Exception gibt. Mit debug_backtrace() könnte ich an diese Methoden dann auch alle Daten übergeben.
Mit Zitat antworten
  #6 (permalink)  
Alt 18-10-2007, 00:51
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von jahlives
Und die müsste doch in debug_backtrace() beim Aufruf der Methode throwException enthalten sein. Oder irre ich mich da?
Ich nehme an, er will in app::throwException() nur deswegen noch trigger_error() aufrufen, damit er die PHP-eigenen Fehlerbehandlungsroutinen nutzen kann (Fehlermeldung erzeugen, ins Log schreiben und ggf. ausgeben).
Das bringt ihm aber nichts, weil er die Daten aus dem Backtrace nicht in die Fehlermeldung rein bekommt - man kann trigger_error() keine Zeilennummer übergeben. PHP holt sich die aus dem Parsetree.

Aber wenn er sowieso eigene Fehlerbehandlungsroutinen implementiert, kann er auch gleich das Verhalten von trigger_error() nachbauen. Ist ja nicht so schwer, er braucht nur ini_get(), error_log() und echo.
Auf trigger_error() kann er dann völlig verzichten.
Mit Zitat antworten
  #7 (permalink)  
Alt 18-10-2007, 00:51
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das normale Exception handling von PHP funktioniert doch super ?!
PHP-Code:
class ParameterException extends Exception{
...
}

throw new 
ParameterException("Falscher Parameter");

try {...}
catch(
Exception $e){
$e->getMessage();

usw.
was man hald so von exceptions erwartet
kannst auch print stack trace machen etc...
Mit Zitat antworten
  #8 (permalink)  
Alt 18-10-2007, 00:54
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok, sehr schön :-) dann verzichte ich auf die PHP-Fehlerroutinen und baue diese lieber selbst nach.
Das ganze läuft nach MVC und mir ist wichtig, dass ich die einzelnen Teile problemlos austauschen kann. Und da bin ich mit eigenen Routinen wesentlich flexibler.

Vielen Dank euch! (brauchte nur nochmal Bestätigung, dass das nicht absolut müllig ist :-) )
Mit Zitat antworten
  #9 (permalink)  
Alt 18-10-2007, 01:11
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Richtig schick wäre
PHP-Code:
class app {
    private static 
$_instance;    // Singleton
    
private function __construct() {}    // Singleton
    
private function __clone() {}    // Singleton

    
public static function getInstance() {
        
set_exception_handler(array('app''exceptionHandler'));
        if (
null === self::$_instanceself::$_instance = new self();
        return 
self::$_instance;
    }
    public static function 
exceptionHandler($e) {
        
// Fehlerbehandlung
    
}

Mit Zitat antworten
  #10 (permalink)  
Alt 18-10-2007, 08:36
strauberry
 Registrierter Benutzer
Links : Onlinestatus : strauberry ist offline
Registriert seit: Nov 2002
Beiträge: 616
strauberry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das mit dem Singleton ist schon drin :-) Bei deinem Vorschlag hab ich jetzt aber ja auch wieder die PHP-Fehlerroutinen und wenn ich in meinem Script $app->throwException mache, kommt wieder das Zeilenproblem... ich werde auf den error-handler ganz verzichten, denke ich und in meine eigenen ExceptionHandler die Funktionalitäten einbauen...
Mit Zitat antworten
  #11 (permalink)  
Alt 18-10-2007, 14:39
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Das mit dem Singleton ist schon drin :-) Bei deinem Vorschlag hab ich jetzt aber ja auch wieder die PHP-Fehlerroutinen und wenn ich in meinem Script $app->throwException mache, kommt wieder das Zeilenproblem... ich werde auf den error-handler ganz verzichten, denke ich und in meine eigenen ExceptionHandler die Funktionalitäten einbauen...
Wo? Von Fehler steht bei onemorenerd garnichts. Den Unterschied zwischen Errorhandling und Exceptions kennst du aber oder?
Statt etwas eigenes zu basteln solltest du vernünftig die PHP Exceptions benutzen (am besten für jegliche Fehler). Wenn du dann irgendwo im Code davon ausgehst das ein Fehler auftreten könnte fängst du sie entsprechend ab und reagierst darauf.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #12 (permalink)  
Alt 18-10-2007, 21:54
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du hast zu schnell gelesen. Ich schrieb set_exception_handler, nicht error. Es ziehlt darauf ab, Exceptions aller Art zu fangen. So mußt du nicht $app->throwException() aufrufen, sondern kannst einfach sagen:
throw new Exception()

Die Singleton-Konstruktion sollte nur ein Schmankerl sein, weil es naheliegend ist, dass eine Klasse namens app nicht mehrfach instanziert werden sollte.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:13 Uhr.