2010-11-21 10 views
3

Ich mache ein einfaches Kartenspiel in PHP. Wenn ein Benutzer versucht, eine Karte auszuspielen, möchte ich eine Ausnahme auslösen, wenn sie dies kann/kann. Anstatt eine Zahl mit einer bestimmten Bedeutung zurückzugeben (z. B. 1 bedeutet schlechte Karte, 2 bedeutet nicht, dass Sie an der Reihe sind ... usw.), wollte ich benutzerdefinierte Ausnahmen verwenden. Ich würde diese Ausnahmen abfangen und die Nachricht dem Benutzer anzeigen.Sprudeln Ausnahmen in PHP?

Ich erkenne, dass Ausnahmen für ungewöhnliche Fehler gedacht sind, aber ich denke, das ist eine gute Möglichkeit, mein Programm zu entwerfen.

Das Problem: meine Ausnahmen werden nicht abgefangen. Ich habe eine Seite namens play.php, die eine Klasse namens Game steuert, die eine Runde hat, die die Ausnahme auslöst. Die play.php Seite bekommt die Runde vom Spiel und macht Funktionsanrufe darauf. Allerdings heißt es, die Ausnahme wird nicht in der Runde gefangen.

Gibt es eine schnelle Lösung dafür? Wie kann ich die Ausnahme von meiner Round-Klasse auf meine play.php-Seite übertragen?

// in PLAY.php 
try { 
    $game->round->startRound($game->players); 
} catch (RoundAlreadyStartedException $e) { 
    echo $e->getMessage(); 
} 

// in ROUND class 
     if (!($this->plays % (self::PLAYS_PER_ROUND + $this->dealer))) { 
      try { 
       throw new RoundAlreadyStartedException(); 
      } catch (RoundAlreadyStartedException $e) { 
       throw $e; 
      } 
      return; 
     } 

Ich habe versucht zu kontrollieren, nicht Fangen, Werfen, Erneutes Auslösen usw.

+6

Das klingt einfach kaputt. – delnan

+1

Ich bin von einem Java-Hintergrund :) – Lindz

+1

Ziemlich schwer zu diagnostizieren, ohne Code zu betrachten. –

Antwort

6

ich mit einigen der Kommentare einig, dass dies eine seltsame Art und Weise zu erreichen, was Sie tun wollen, aber ich kann sehe keine wirklichen Code-Probleme. Mein Testfall:

class TestException extends Exception { 
} 

function raiseTestException() { 
    try { 
     throw new TestException("Test Exception raised"); 
    } catch(TestException $e) { 
     throw $e; 
    } 
    return; 
} 

try { 
    raiseTestException(); 
} catch(TestException $e) { 
    echo "Error: " . $e->getMessage(); 
} 

// result: "Error: Test Exception raised"; 

Ist es tatsächlich die RoundAlreadyStartedException, die nicht gefangen wird, oder einen anderen Fehler entdeckt?

EDIT: in Klassen eingewickelt, auf gut Glück, dass es einen Unterschied macht (es nicht):

class TestException extends Exception { 
} 

class TestClass { 

    function raiseTestException() { 
     try { 
      throw new TestException("Test Exception raised"); 
     } catch(TestException $e) { 
      throw $e; 
     } 
     return; 
    } 

} 

class CallerClass { 

    function callTestCallMethod() { 
     $test = new TestClass(); 
     try { 
      $test->raiseTestException(); 
     } catch(TestException $e) { 
      echo "Error: " . $e->getMessage(); 
     } 
    } 

} 

$caller = new CallerClass(); 
$caller->callTestCallMethod(); 

// result: "Error: Test Exception raised"; 
3

Ich hatte das gleiche seltsame Verhalten mit Ausnahmen sprudeln nicht. Es stellt sich heraus, dass ich die Ausnahmen in einem anderen Namespace hatte, aber ich habe es nicht explizit verwendet und PHP hat sich darüber nicht beschweren. Also, Hinzufügen using mynamespace\exceptions\MyException; löste es. Vielleicht könnte dir das auch passieren.

HTH.

+1

Wenn Sie Namespaces in der Klasse verwenden, in der Sie versuchen, Objekte abzufangen, sollten Sie Folgendes tun: ...} catch (\ Exception $ e) {... (Beachten Sie den umgekehrten Schrägstrich, um anzuzeigen, dass es sich um den "Root-Namespace" –

1

ich nur dieses gleiche Problem in Laravel 4.2

Als Laravel in dem Verzeichnis \ Exception-Handler hört man die Wurzel nicht verwenden kann, eine Ausnahme und erwarten, obwohl die Anwendung Blase zu werfen, wenn Sie Laravel ändern oder erweitern. Was Sie brauchen, ist eine leere Exception zu erstellen, die \ Exception für Ihren Namespace erweitert und dann Ihre Namespace Exception abfängt, wie immer Sie es brauchen.

<?php 
namespace Yournamespacehere; 

class Exception extends \Exception { 
}