Ausnahmen in einem PHP Try Catch-Block auslösen

76

Ich habe eine PHP-Funktion in einer Drupal 6 .module-Datei. Ich versuche, erste Variablenüberprüfungen durchzuführen, bevor ich intensivere Aufgaben (z. B. Datenbankabfragen) ausführe. In C # habe ich IF-Anweisungen am Anfang meines Try-Blocks implementiert, die neue Ausnahmen ausgelöst haben, wenn eine Validierung fehlgeschlagen ist. Die ausgelöste Ausnahme würde im Catch-Block abgefangen. Folgendes ist mein PHP-Code:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}

Wenn ich jedoch versuche, den Code auszuführen, wird mir mitgeteilt, dass Objekte nur innerhalb des Catch-Blocks geworfen werden können.

Danke im Voraus!

kaspnord
quelle
3
tl; dr "wirf $ e-> getMessage ();" sollte "$ e werfen" sein;
Christoff Erasmus
Der gleiche Code scheint zu erzeugen : Parse error: syntax error, unexpected 'throw' (T_THROW). Ich denke nicht mehr unterstützt.
user2924019

Antworten:

105
function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  }
}
AlienWebguy
quelle
1
Ja, Ihre beiden Vorschläge im Catch-Block lösen mein Problem. Vielen Dank!
Kaspnord
67

Um zu werfen, tun

 throw $e;

nicht die Nachricht.

Chen Kinnrot
quelle
Vielen Dank, diese Lösung ist am besten für meine Bedürfnisse geeignet.
Kaspnord
Das dachte ich mir, gerne helfen.
Chen Kinnrot
6
Würde das die Stapelinformationen jedoch beibehalten oder würde es sie überschreiben?
DanMan
4
behalten, um einen neuen e
Chen Kinnrot
16

Entfernen Sie einfach den throwaus dem Fangblock - ändern Sie ihn in einen echooder behandeln Sie den Fehler auf andere Weise.

Es sagt Ihnen nicht, dass Objekte nur in den catch-Block geworfen werden können, es sagt Ihnen, dass nur Objekte geworfen werden können, und der Ort des Fehlers befindet sich im catch-Block - es gibt einen Unterschied.

Im catch-Block versuchen Sie, etwas zu werfen, das Sie gerade gefangen haben - was in diesem Zusammenhang ohnehin wenig Sinn macht - und das, was Sie zu werfen versuchen, ist eine Zeichenfolge.

Eine reale Analogie zu dem, was Sie tun, besteht darin, einen Ball zu fangen und dann zu versuchen, nur das Logo des Herstellers an eine andere Stelle zu werfen. Sie können nur ein ganzes Objekt werfen, keine Eigenschaft des Objekts.

DaveRandom
quelle
Danke für die Klarstellung.
Kaspnord
Gute Analogie (y).
Tony Vlcek
7
throw $e->getMessage();

Du versuchst einen zu werfen string

Als Nebenbemerkung: Ausnahmen sind normalerweise die Definition von Ausnahmezuständen der Anwendung und nicht für Fehlermeldungen nach der Validierung. Dies ist keine Ausnahme, wenn ein Benutzer Ihnen ungültige Daten gibt

KingCrunch
quelle
Was wäre ein besserer Weg, um mit Validierungen umzugehen? Wären IF-Anweisungen für den Umgang mit ungültigen Benutzerdaten besser geeignet?
Kaspnord
Kurzum: Ja. Kurz gesagt: Behandeln Sie das Auftreten ungültiger Argumente wie jede andere Situation, die in Ihrer App auftreten kann, und zeigen Sie eine andere nützliche (Fehler-) Seite an. function validateField($validate) {return empty($validate);}und irgendwo zum Beispielif validateField($x){ echo "Field is empty";}else{doSomethingUseful();}
KingCrunch
4
@lazycommit "ungültige Daten" ist ein bisschen zu allgemein. Wenn Sie „ungültige Werte von einem Benutzer gegeben“ bedeuten, als sie von den Anwendungen , die nicht ungültig Sicht , da die Anwendung muss diese und daher erwarten , müssen sie geeignete Behandlung (-> Validierung). Wenn Sie später während der Verarbeitung ungültige Daten übergeben (von einem Backend oder weil Sie nicht ordnungsgemäß validiert haben), dann ja: Ausnahme. Um es zusammenzufassen: Verwenden Sie Exceptions nicht für den Kontrollfluss (hier: Validierung) :)
KingCrunch
Sie können nur throwObjekte, so throw $e;oder throw new \Exception( $e->getMessage() );.
Samuel Elh
0

Throw benötigt ein Objekt, das von instanziiert wird \Exception. Nur der $eGefangene kann den Streich spielen.

throw $e
Goms
quelle