PHP:检测我们是否在外部try..catch块中

时间:2013-03-13 14:00:51

标签: php exception exception-handling try-catch

是否可以判断我们是否在外部try..catch块内?

示例代码(请以 为例):

<?php
class Foo{
    public function load($id)
    {
        try{
            // Model throw NodeNotFoundException only in rare cases
            $node = $this->getModel()->loadById($id);
        }
        catch(NodeNotFoundException $nle)
        {
            // @here I need to tell if im in the First case or in the Second one,
            // detecting the external try..catch block
            if(externalTryCatchBlock() === true)
            {
                throw $nle;
            }
            else
            {
                watchdog('Unable to find node', $nle->details);
            }
            return false;
        }
        catch(Exception $e)
        {
            watchdog('Something gone wrong.');
            return null;
        }
        return $node;
    }
}

$foo = new Foo();

// First case, no external try..catch 
$node = $foo->load(2);

// Second case: we need to do here something different if the node load
// throw an exception
try{
    $another_node = $foo->load(3);
}
catch(NodeNotFoundException $nle)
{
    watchdog('Unable to find node, using default.');
    $another_node = Bar::defaultNode(); // This is JUST for example
}

// Do something with $another_node
?>

基本上,只有在有另一个catch块等待它时才需要重新抛出异常(NodeNotFoundException),以避免Fatal error: Uncaught exception

当然,对于上面的考试,我可以使用2种加载方法(一种用另一种用于尝试..)但我想避免这种情况...我很想知道是否可以检测PHP中的try..catch块

1 个答案:

答案 0 :(得分:0)

担心如何调用它不是一段代码的工作。代码抛出异常,始终是故事的结尾。因此代码具有“属性”可能抛出异常x

/**
 * Does something.
 *
 * @return mixed Some value.
 * @throws SomeException if something went wrong.
 */
function foo() {
   ...
}

现在,无论谁调用此代码,都需要做好准备,以便随时抛出异常。代码无法担心某人是否可以捕获异常。如果存在异常情况,则会抛出异常,因为它无法继续执行其工作。 调用者需要为此做好准备,而不是相反。