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!


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;
    */
  }
}

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.


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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.