【问题标题】:Converting exceptions between different namespaces在不同命名空间之间转换异常
【发布时间】:2018-02-20 05:54:06
【问题描述】:

MyApp 命名空间中,我有以下内容:

$class='MyApp\Callbacks\\'.$class;
$this->callback[$callBackId]=new $class();

此对象位于 MyApp\Callbacks 命名空间中,可能会引发 CallbackException (\MyApp\Callbacks\CallbackException) 异常。

我发现自己经常做以下事情:

try {
    $this->callback[$callBackId]->someMethod();
}
catch(\MyApp\Callbacks\CallbackException $e) {
    throw new MyAppExeption($e->getMessage(),$e->getCode());    
}

如何将这些异常转换为MyAppException,而不单独捕获它们。我认为可能的解决方案是:

  1. 让这个对象直接抛出\MyApp\MyAppExeption 异常。这味道不对。
  2. \MyApp\MyAppExeption 异常注入此对象。对此也不确定。
  3. 在我遇到MyAppExeption的每个地方都在一个街区中捕获\MyApp\Callbacks\CallbackException。不这么认为。
  4. 围绕它创建一些包装器。听起来这可能是最好的,但我不知道如何实现它。

请指教。谢谢

【问题讨论】:

  • 你为什么觉得有必要这样做?
  • 如果您从 \MyApp\MyAppException 扩展您的个人回调异常,并捕获 \MyApp\MyAppException,那么它也会捕获您的任何个人异常
  • @Federkun 哪个部分?不单独抓他们?如果这样,只是为了减少代码重复。您是否同意我的解决方案 #1 和 #2 可能是坏主意?
  • @MarkBaker 虽然我碰巧是回调类的作者,但情况可能并非总是如此,并且对这是否是一种更灵活的方法感兴趣。如果我要扩展它们,为什么不修改所有回调类并让它们直接抛出`\MyApp\MyAppException`?
  • 为什么不首先捕获异常,这样您就可以在一个简单的捕获中捕获所有内容...。您没有指出回调都是由不同的人编写的,因此不能' 不会在您的环境中更改,即使它们都属于同一个 MyApp 命名空间

标签: php exception namespaces


【解决方案1】:

我目前只需要公开几个方法,所以我对它们进行了硬编码。如果我以后想要更多,可能会包装一个类并使用__invoke

class MyApp
{
    private $callbacks;

    public function __construct($callbacks)
    {
        $this->callbacks=$callbacks;
    }

    public function someMethod($x,$y) {
        try {
            $this->someMethod($x,$y);
        }
        catch(\MyApp\Callbacks\CallbackException $e) {
            //Modify if desired
            throw new MyAppExeption($e->getMessage(),$e->getCode());    
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多