2010-11-21 11 views
3

私はPHPで簡単なカードゲームを作っています。ユーザーがカードを再生しようとすると、私は例外をスローしたい、できない場合はスローしたい。特定の意味を持つ数字を返すのではなく(例えば、1は悪いカード、2はあなたの順番などを意味します)、カスタマイズされた例外を使いたいと思いました。私はこれらの例外をキャッチし、ユーザーにメッセージを表示します。PHPでの例外のバブリング?

例外は通常のエラーではないことを認識していますが、これは私のプログラムを設計する良い方法だと思います。

問題:私の例外はキャッチされていません。私は例外をスローするRoundを持つGameというクラスを制御するplay.phpというページを持っています。 play.phpページは、ゲームからラウンドを取得し、その上で関数呼び出しを行います。しかし、それは例外がラウンドでキャッチされていないと言います。

このためのクイックフィックスはありますか? Roundクラスからplay.phpページへの例外をどのようにバブルアップできますか?私はしかし私ができる、これはあなたが何をしたい達成する奇妙な方法であるとのコメントをいくつかに同意するなど、再スロー、投げ、キャッチない、キャッチ

+6

これはちょうど壊れたようです。 – delnan

+1

私はJavaの背景から来ています:) – Lindz

+1

見た目のコードなしで診断するのはかなり難しいです。 –

答えて

6

を試してみた

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

実際のコードに問題があるかどうかはわかりません。私のテストケース:

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"; 

が実際にキャッチされていないRoundAlreadyStartedException、または他のいくつかのエラーが発生しますか?

EDIT:(それはない)、それは違いを作ることをオフのチャンスに、クラスに包まれた:

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

私はバブリングない例外を除いて、これと同じ奇妙な振る舞いを持っていました。 私は別の名前空間で例外が発生していることが判明しましたが、明示的に使用していなかったので、PHPはそれに不平を言っていませんでした。 したがって、using mynamespace\exceptions\MyException;を追加すると解決しました。 それもあなたに起こっている可能性があります。

HTH。

+1

また、物事をキャッチしようとしているクラスで名前空間を使用している場合は、次のようにしてください: ...} catch(\ Exception $ e){... (バックスラッシュは、 "ルート名前空間") –

1

I Laravel 4.2

でちょうどこの同じ問題LaravelはあなたがLaravelを変更したり、拡張しない限り、あなたは例外をスローし、アプリケーションしかし、バブルに期待するルートを使用することはできません\例外ハンドラに耳を傾けたよう。あなたが必要とするのは、あなたの名前空間の\ Exceptionを拡張して空の例外を作成し、あなたが必要としていた名前空間の例外をキャッチすることです。

<?php 
namespace Yournamespacehere; 

class Exception extends \Exception { 
} 
関連する問題