2016-05-31 13 views
3

Ich verstehe nicht, wie Sie ordnungsgemäß erstellen und nützliche Fehlermeldungen mit PHP im Web zurückgeben.Rückgabe nützliche Fehlermeldungen mit PHP

Ich habe eine Klasse

class Foo { 
    const OK_IT_WORKED = 0; 
    const ERR_IT_FAILED = 1; 
    const ERR_IT_TIMED_OUT = 3; 

    public function fooItUp(){ 
     if(itFooed) 
      return OK_IT_WORKED; 
     elseif(itFooedUp) 
      return ERR_IT_FAILED; 
     elseif(itFooedOut) 
      return ERR_IT_TIMED_OUT; 
    } 
} 

und eine andere Klasse, die diese Klasse verwendet, etwas Nützliches, dann wieder das Ergebnis an den Benutzer zu tun. Ich frage mich nur, wo ich den String-Wert für alle meine Fehlermeldungen gesetzt habe.

class Bar { 
    public function doFooeyThings(stuff){ 
     $res = $myFoo->fooItUp(); 
     // now i need to tell the user what happened, but they don't understand error codes 
     if($res === Foo::OK_IT_WORKED) 
      return 'string result here? seems wrong'; 
     elseif ($res === Foo::ERR_IT_FAILED) 
      return Foo::ERR_IT_FAILED_STRING; // seems redundant? 
     elseif($res === Foo:ERR_IT_TIMED_OUT) 
      return $res; // return number and have an "enum" in the client (js) ? 
    } 

} 

Antwort

2

Sie sollten möglichst keine Fehlerzustände zurückgeben. Verwenden Sie stattdessen Ausnahmen. Wenn Sie noch nie Ausnahmen verwendet haben, bevor Sie darüber lesen können here

Es gibt mehrere Möglichkeiten, wie Sie Ausnahmen in Ihrem Beispiel verwenden können. Sie könnten benutzerdefinierte Ausnahmen für jeden Fehler oder für jede Fehlerkategorie erstellen. Mehr zu benutzerdefinierten Ausnahmen here oder Sie könnten eine Instanz der Standard Exception Klasse erstellen, die die Fehlermeldungen als Strings liefert.

Der folgende Code folgt dem zweiten Ansatz:

class Foo { 
    const OK_IT_WORKED = 0; 
    const ERR_IT_FAILED = 1; 
    const ERR_IT_TIMED_OUT = 3; 

    public function fooItUp(){ 
     if(itFooed) 
      return OK_IT_WORKED; 
     else if(itFooedUp) 
      throw new Exception("It failed") 
     else if(itFooedOut) 
      throw new Exception("Request timed out"); 
    } 
} 

Ich bin sicher, dass Sie einige elegantere Nachrichten als die verwendete ich denken kann. Wie auch immer, können Sie voran gehen und diese Ausnahmen auf der Anrufer-Methode behandeln mit try/catch-Blöcken: von Ihrem Code

class Bar { 
    public function doFooeyThings(stuff){ 
     try 
     { 
      $res = myFoo->fooItUp(); 
     } 
     catch(Exception $e) 
     { 
      //do something with the error message 
     } 

    } 

} 

Was auch immer Ausnahme von fooItUp geworfen wird, wird „gefangen“ durch den catch Block und behandelt werden.

Zwei Dinge, die Sie sollten auch berücksichtigen sind:

  • ist es am besten nicht Ihre Benutzer detaillierte Informationen über Fehler zu zeigen, weil die Informationen, die von Nutzern mit böswilliger Absicht verwendet werden könnten

  • Im Idealfall sollten Sie eine Art der globalen Ausnahmebehandlung

1

Eine Lösung ist die Verwendung von Ausnahmen in Verbindung mit set_exception_handler().

<?php 

set_exception_handler(function($e) { 
    echo "Error encountered: {$e->getMessage()}"; 
}); 

class ErrorMessageTest 
{ 
    public function isOk() 
    { 
     echo "This works okay. "; 
    } 

    public function isNotOkay() 
    { 
     echo "This will not work. "; 
     throw new RuntimeException("Violets are red, roses are blue!! Wha!?!?"); 
    } 
} 

$test = new ErrorMessageTest(); 

$test->isOk(); 
$test->isNotOkay(); 

set_exception_handler() Die Methode verwendet einen aufrufbaren, die eine Ausnahme als Parameter akzeptiert. Hier können Sie Ihre eigene Logik für eine ausgelöste Ausnahme angeben, falls sie nicht in einem try/catch gefangen ist.

Live Demo

Siehe auch: set_exception_handler() documentation