2016-05-31 14 views
-1

Ich habe einige IF/THEN-Logik, die schwer zu lesen ist, und denke darüber, Ausnahmen zu verwenden.Unterscheidung zwischen verschiedenen PHP-Ausnahmen

Der Code wird die Benutzereingabe testen und Ausnahmen entsprechend auslösen. Meine catch-Anweisung behandelt die erwarteten Ausnahmen, aber wenn die Ausnahme nicht erwartet wird (wie ich eine PDO-Anweisung vermasselt habe), möchte ich die Ausnahme auslösen und das Fehlersystem von PHP damit umgehen lassen. Alle vorweggenommenen Ausnahmen werden auf die gleiche Weise behandelt, und ich möchte nicht mehrere Versuche/Fänge bei jedem Test verwenden.

Wie kann ich in der catch-Anweisung basierend auf der Ausnahme verschiedene Aktionen ausführen?

try { 
    $user_input=$_POST['user_input']; 
    // rest of code here... 
    if (test1($user_input)) { 
     throw new Exception("Anticipated exception 1."); 
    } 
    // rest of code here... 
    //Some PDO which might generate a non-anticipated exception 
    if (test2($user_input)) { 
     throw new Exception("Anticipated exception 2."); 
    } 
    // rest of code here... 
} 
catch (Exception $e) { 
    if(anticipatedException($e)) { 
     //Deal with it 
    } 
    else { 
     throw $e; 
    } 
} 
+0

Könnten Sie nicht Gruppe Ihre besondere Ausnahmen einen gemeinsamen Vorfahren haben? – mario

+0

@mario Ich verstehe es nicht. Bitte erläutern. – user1032531

+2

Wie 'UserInputTooShortExc erweitert CommonInputExceptions' und' UserInputTooLong' usw. das gleiche tun; fange dann einfach den 'Common..Exc' an. – mario

Antwort

2

Durch verschiedene Ausnahmen. das heißt

class ExceptionOne extends Exception {} 
class ExceptionTwo extends Exception {} 

try { 
    $user_input=$_POST['user_input']; 
    // rest of code here... 
    if (test1($user_input)) { 
     throw new ExceptionOne("Anticipated exception 1."); 
    } 
    // rest of code here... 
    //Some PDO which might generate a non-anticipated exception 
    if (test2($user_input)) { 
     throw new ExceptionTwo("Anticipated exception 2."); 
    } 
    // rest of code here... 
} 
catch (ExceptionOne $e) { 
    /*...*/ 
} 
catch (ExceptionTwo $e) { 
    /*...*/ 
} 

Auch Vordefinierte Ausnahmen überprüfen, die zu einer Gruppe Ihnen helfen könnten: http://php.net/manual/en/spl.exceptions.php

+0

Danke johannes. Wo würde die PDO-Ausnahme gefangen werden? Könnte ich am Ende einfach 'catch (Exception $ e) {throw $ e;}' setzen? – user1032531

+0

PDO löst eine 'PDOException' aus, so dass' '(PDOException $ e)' 'http://php.net/pdoexception – johannes

+0

Ah, vergiss es. Dachte nicht. Wenn eine PDO-Ausnahme aufgetreten ist, würde sie nicht abgefangen werden, also warum fangen Sie sie und werfen Sie sie erneut. Danke, hab es! – user1032531