2016-04-26 10 views
1

Meine Frage bezieht sich auf die korrekte Art, Ausnahmen in PHP abzufangen. Basierend auf der beiliegenden examples des PHP MongoDB-Treiber, ich habe folgendes Skript erstellt:So fangen Sie Exceptions in PHP und MongoDB korrekt ab

<?php 

try { 

    $mng = new MongoDB\Driver\Manager("mongodb://localhost:2717"); 
    $query = new MongoDB\Driver\Query([], ['sort' => [ 'name' => 1], 'limit' => 5]);  

    $rows = $mng->executeQuery("testdb.cars", $query); 

    foreach ($rows as $row) { 

     echo "$row->name : $row->price\n"; 
    } 

} catch (MongoDB\Driver\Exception\Exception $e) { 

    $filename = basename(__FILE__); 

    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n"; 

    echo "Exception:", $e->getMessage(), "\n"; 
    echo "In file:", $e->getFile(), "\n"; 
    echo "On line:", $e->getLine(), "\n";  
} 

?> 

Das Beispiel ist Bildungs-und bedeuten auf dem PHP-CLI ausgeführt werden. In PHP CLI erhalten wir alle Ausnahmen auf der Konsole, aber aus didaktischen Gründen wollte ich Ausnahmen im try/catch-Block abfangen.

Ich habe mehr Java-Code als PHP gesehen und daher, ein generisches MongoDB\Driver\Exception\Exception zu fangen, sieht nicht gut für mich aus. In Java fangen wir bestimmte Ausnahmen ab und haben mehrere try/catch-Blöcke für verschiedene Arten von Ausnahmen.

Der Fahrer hat die folgenden Ausnahmen:

MongoDB\Driver\Exception\AuthenticationException 
MongoDB\Driver\Exception\BulkWriteException 
MongoDB\Driver\Exception\ConnectionException 
MongoDB\Driver\Exception\ConnectionTimeoutException 
MongoDB\Driver\Exception\Exception 
MongoDB\Driver\Exception\ExecutionTimeoutException 
MongoDB\Driver\Exception\InvalidArgumentException 
MongoDB\Driver\Exception\LogicException 
MongoDB\Driver\Exception\RuntimeException 
MongoDB\Driver\Exception\SSLConnectionException 
MongoDB\Driver\Exception\UnexpectedValueException 
MongoDB\Driver\Exception\WriteException 

Ist das eine reine Art und Weise Ausnahmen in PHP zu fangen?

Antwort

1

Wie wäre es, eine switch-Anweisung in den Catch-Teil zu setzen und den Typ der Exception mit dem instanceof Sprachkonstrukt oder der get_class()-Funktion zu bestimmen?

Zum Beispiel:

[...] 

} catch(\Exception $e) { 
    switch (get_class($e)) { 
    case 'MongoDB\Driver\Exception\AuthenticationException': 
     // do stuff 
     break; 

    case 'MongoDB\Driver\Exception\BulkWriteException': 
    //etc, etc... 
    } 
} 

Zuerst würde ich den Rückgabewert von get_class() untersuchen, um sicherzustellen, dass Sie mir das Ergebnis mit dem genauen Ausnahme Namen zu vergleichen.

+0

fügen wir es so tun könnten, aber dies ist die empfohlene Methode, Ausnahmen in PHP zu fangen? Wenn ja warum? –

2

Sie können mehrere catch-Anweisungen

<?php 

try { 

    $mng = new MongoDB\Driver\Manager("mongodb://localhost:2717"); 
    $query = new MongoDB\Driver\Query([], ['sort' => [ 'name' => 1], 'limit' => 5]);  

    $rows = $mng->executeQuery("testdb.cars", $query); 

    foreach ($rows as $row) { 

     echo "$row->name : $row->price\n"; 
    } 

} catch (MongoDB\Driver\Exception\AuthenticationException $e) { 

    echo "Exception:", $e->getMessage(), "\n"; 
} catch (MongoDB\Driver\Exception\ConnectionException $e) { 

    echo "Exception:", $e->getMessage(), "\n"; 
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) { 

    echo "Exception:", $e->getMessage(), "\n"; 
} 

?> 
+1

So wird es in Java gemacht. Die Frage ist, ob es der richtige Weg ist. (Ich sah Code in PHP auf diese Weise nicht.) Und die 'MongoDB \ Driver \ Exception \ Exception' fängt auch die' ConnectionTimeoutException 'ab, also ist es vielleicht redundant, dies auf diese Weise zu tun. –

+0

Ja, es ist der Java Weg und das gleiche in der PHP. Für weitere Informationen können Sie http://php.net/manual/en/language.exceptions.php sehen. MongoDB \ Driver \ Exception \ Exception ist die generische Klasse zum Abfangen aller Ausnahmen und muss als Fallback für Ausnahmen verwendet werden, die nicht speziell in catch-Anweisungen abgefangen werden. – prabhat

Verwandte Themen