【问题标题】:Bubbling up exceptions in PHP?在 PHP 中冒泡异常?
【发布时间】:2011-05-13 11:53:53
【问题描述】:

我正在用 PHP 制作一个简单的纸牌游戏。当用户尝试打牌时,如果他们可以/不能,我想抛出异常。我不想返回具有特定含义的数字(例如 1 表示坏牌,2 表示轮不到你……等等),我想使用自定义的异常。我会捕获这些异常并向用户显示消息。

我意识到异常是针对不寻常的错误,但我认为这是设计我的程序的好方法。

问题:我的异常没有被捕获。我有一个名为 play.php 的页面,它控制一个名为 Game 的类,该类有一个引发异常的 Round。 play.php 页面从游戏中获取回合,并对其进行函数调用。但是,它说异常没有被循环捕获。

是否有快速解决此问题的方法?我怎样才能将 Round 类中的异常冒泡到我的 play.php 页面?

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

我试过接,不接,扔,再扔等等。

【问题讨论】:

  • 这听起来很糟糕。
  • 我来自 Java 背景 :)
  • 如果不看任何代码就很难诊断。
  • 你在使用try ... catch 块吗?
  • I realize that exceptions are meant for out of the ordinary errors, but I think this is a good way to design my program. 我想我不同意你的观点;)。普通的 ol' 返回值有什么问题?

标签: php exception


【解决方案1】:

我在 Laravel 4.2 中遇到了同样的问题

当 Laravel 监听 \Exception 处理程序时,您不能使用根来抛出异常并期望通过应用程序冒泡,除非您修改或扩展 Laravel。您需要创建一个空的异常,它为您的命名空间扩展 \Exception,然后根据需要捕获命名空间异常。

<?php
namespace Yournamespacehere;

class Exception extends \Exception {
}

【讨论】:

    【解决方案2】:

    我也有同样的奇怪行为,但异常没有冒泡。 事实证明,我在另一个命名空间中有异常,但我没有明确使用它,PHP 也没有抱怨。 所以,添加using mynamespace\exceptions\MyException; 解决了它。 也许这也可能发生在你身上。

    HTH。

    【讨论】:

    • 此外,如果您在尝试捕获事物的类中使用命名空间,请确保执行以下操作: ... } catch (\Exception $e) { ... (注意反斜杠,表示它是“根命名空间”)
    【解决方案3】:

    我同意一些 cmets 的观点,即这是实现您想要做的事情的一种奇怪方式,但是我看不到任何实际的代码问题。我的测试用例:

    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 没有被捕获,还是其他错误?

    编辑:包含在类中,如果它有所作为(它没有):

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

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多