Frage

Jeder hier sollte wissen, die 'oder' Abschluss an, in der Regel auf eine Matrize () Befehl geklebt:

$foo = bar() or die('Error: bar function return false.');

Die meisten der Zeit wir etwas sehen wie:

mysql_query('SELECT ...') or die('Error in during the query');

Allerdings kann ich nicht verstehen, wie genau die ‚oder‘ Anweisung funktioniert.

Ich möchte eine neue Ausnahme statt Würfel werfen (), aber:

try{
    $foo = bar() or throw new Exception('We have a problem here');

nicht funktioniert, und weder

$foo = bar() or function(){ throw new Exception('We have a problem here'); }

Der einzige Weg, ich fand, dass zu tun, ist dieser schreckliche Gedanke:

function ThrowMe($mess, $code){
    throw new Exception($mess, $code);
}
try{
    $foo = bar() or ThrowMe('We have a problem in here', 666);
}catch(Exception $e){
    echo $e->getMessage();
}

Aber es gibt einen Weg, um eine neue Ausnahme unmittelbar nach der ‚oder‘ Anweisung zu werfen?

oder diese Art von Struktur ist obligatorisch (i dont alles ThrowMe Funktion liek):

try{
    $foo = bar();
    if(!$foo){
        throw new Exception('We have a problem in here');
    }
}catch(Exception $e){
    echo $e->getMessage();
}

Bearbeiten : was i will wirklich die Verwendung einer if () überprüft jede mögliche gefährliche Operation i tun, zum Beispiel zu vermeiden:

#The echo $e->getMessage(); is just an example, in real life this have no sense!
try{
    $foo = bar();
    if(!$foo){
        throw new Exception('Problems with bar()');
    }
    $aa = bb($foo);
    if(!$aa){
        throw new Exception('Problems with bb()');
    }
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i relly prefer to use something like:

try{
    $foo = bar() or throw new Exception('Problems with bar()');
    $aa = bb($foo) or throw new Exception('Problems with bb()');
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#Actually, the only way i figured out is:

try{
    $foo = bar() or throw new ThrowMe('Problems with bar()', 1);
    $aa = bb($foo) or throw new ThrowMe('Problems with bb()', 2);
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i'll love to thro the exception directly instead of trick it with ThrowMe function.

Andere Tipps

Warum nicht bar() und bb() die Ausnahmen werfen? In PHP Ausnahmen sprudeln, so gibt es keine Notwendigkeit, die Ausnahme in der Funktion / Methode zu werfen, wo Sie bar() / bb() nennen. Diese Ausnahmen können bar() / bb() geworfen werden. Falls Sie eine weitere Ausnahme werfen, können Sie einfach tun:

function foo() {
    try {
        $bar = bar();
    } catch (BarException) {
        throw new FooException;
    }
}

Eine Lösung fand ich, dass ersetzen kann „oder die ()“ überall den Ball mit einer anonymen Funktion zu wickeln, die sofort von call_user_func aufgerufen werden:

call_user_func(function(){
    throw new Exception("ERROR");
});

Sie können sehen, dass es durch die Ausführung dieses auf einem Dummy-Skript funktioniert:

false or call_user_func(function(){throw new Exception("ERROR");});

Ich glaube, Sie so etwas wie die letzte Struktur verwenden möchten, obwohl es wirklich keinen Sinn Ausnahmen für die in Verwendung:

$foo = bar();
if(!$foo){
    echo 'We have a problem in here';
}

Per Kommentar - ich glaube nicht, dass Sie in einer einzigen Zeile tun können (das heißt ohne die if(!$foo) Prüfung), und ich stimme zu, dass die Ausnahme wirft Methode ziemlich schrecklich ist. Ich persönlich ziehe die Eindeutigkeit von:

$foo = bar();
if(!$foo){
    throw new Exception('We have a problem in here');
}

, aber das ist eine persönliche Präferenz. Wenn Sie die einzeilige Sache wollen, glaube ich, werden Sie mit Ihrer Ausnahme werfenden Funktion Option gehen.

Ich denke, diese Einschränkung ist wahrscheinlich bis auf PHP dynamische Typisierung Sachen, kann es die Ergebnisse eines Funktionsaufruf zu einem bedingten geworfen, aber nicht die Ergebnisse einer throw.

Hier ist eine einzeilige Lösung ohne die zusätzliche Funktion:

if (!($foo = bar())) throw new Exception('We have a problem here');

Ich habe einfach definiert die Funktion toss hierfür.

function toss(Exception $exception): void
{
    throw $exception;
}

Da die Datei / Zeile / stapeln Informationen werden erfasst, wenn die Ausnahme konstruiert (new) nicht geworfen (throw) dies nicht stört den Call-Stack.

So können Sie dies nur tun.

something() or toss(new Exception('something failed'));

Sie können auch eine benutzerdefinierte Ausnahmeklasse erstellen und es ist statische Konstruktor-Methode statt throw new Exception() Konstruktion verwendet werden.

Ausnahmeklasse:

class CustomException extends Exception {
  static public function doThrow($message = "", $code = 0, Exception $previous = null) {
    throw new Exception($message, $code, $previous);
  }
}

Verbrauch:

try {

  $foo = bar() or CustomException::doThrow('Problems with bar()');
  $aa = bb($foo) or CustomException::doThrow('Problems with bb()');

} catch(Exception $e){
  echo $e->getMessage();
}
  

Hinweis

     

Wenn Sie PHP 7 und höher verwenden -. Sie können statische Methode doThrow() umbenennen einfach throw(), da in PHP 7 und höher ist es erlaubt reservierte Schlüsselwörter als Methodennamen zu verwenden,

scroll top