PHP:如何在异常处理程序中转储所有局部变量

时间:2012-01-03 13:02:13

标签: php

我正在寻找一种让我的异常处理程序转储引发异常的函数的局部变量的方法。这可能吗?

6 个答案:

答案 0 :(得分:7)

get_defined_vars()将返回所有已定义变量的数组。然后,您可以循环遍历每个内容并转储内容,或使用var_dump( get_defined_vars() )将它们全部转储。

答案 1 :(得分:2)

试试var_dump( get_defined_vars( ) );。这应该将所有已定义的变量转储到范围内。

答案 2 :(得分:2)

我认为更好的是设置xDebug

它会自动转储所有环境。每次都会得到类似的内容:

 Catchable fatal error: Argument 1 passed to RogoDeal::getDealerForMe() must be an instance of RogoParticipant, instance of myUser given in G:\webroot\v1-1-5.omyconf\lib\model\doctrine\RogoDeal.class.php on line 512

Call Stack:
    0.0002     336944   1. {main}() G:\webroot\v1-1-5.omyconf\web\frontend_dev.php:0
    0.1244    1983360   2. sfContext->dispatch() G:\webroot\v1-1-5.omyconf\web\frontend_dev.php:13
    0.1244    1983392   3. sfFrontWebController->dispatch() G:\webroot\symfony\lib\util\sfContext.class.php:170
    0.1248    1987104   4. sfController->forward() G:\webroot\symfony\lib\controller\sfFrontWebController.class.php:48
    0.1500    2085896   5. sfFilterChain->execute() G:\webroot\symfony\lib\controller\sfController.class.php:238
    0.1504    2086752   6. sfRenderingFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
    0.1504    2086752   7. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfRenderingFilter.class.php:33
    0.1508    2087584   8. sfBasicSecurityFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
    0.1512    2087584   9. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfBasicSecurityFilter.class.php:72
    0.1515    2088408  10. sfCacheFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
    0.1549    2089920  11. sfFilterChain->execute() G:\webroot\symfony\lib\filter\sfCacheFilter.class.php:65
    0.1553    2090744  12. sfExecutionFilter->execute() G:\webroot\symfony\lib\filter\sfFilterChain.class.php:53
   14.8569   19778472  13. sfExecutionFilter->handleView() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:47
   14.8570   19778472  14. sfExecutionFilter->executeView() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:116
   14.8662   19806016  15. sfPHPView->render() G:\webroot\symfony\lib\filter\sfExecutionFilter.class.php:155
   14.8673   19806352  16. sfPHPView->renderFile() G:\webroot\symfony\lib\view\sfPHPView.class.php:185
   14.8801   19926728  17. require('G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php') G:\webroot\symfony\lib\view\sfPHPView.class.php:75
   16.2403   21796104  18. sfOutputEscaperIteratorDecorator->getDealerForMe() G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php:48
   16.2403   21796304  19. sfOutputEscaperObjectDecorator->__call() G:\webroot\v1-1-5.omyconf\apps\frontend\modules\program\templates\markedSuccess.php:48
   16.2404   21796552  20. call_user_func_array() G:\webroot\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php:64
   16.2404   21796736  21. RogoDeal->getDealerForMe() G:\webroot\symfony\lib\escaper\sfOutputEscaperObjectDecorator.class.php:64

Dump $_SERVER
   $_SERVER['REQUEST_METHOD'] = 'GET'
   $_SERVER['REQUEST_URI'] = '/frontend_dev.php/program/marked?interface=mobile'
   $_SERVER['HTTP_USER_AGENT'] = 'Opera/9.80 (Windows NT 6.1; U; Edition Ukraine Local; ru) Presto/2.10.229 Version/11.60'
Dump $_REQUEST
   $_REQUEST['interface'] = 'mobile'

Variables in local scope (#21):
  $dealer = *uninitialized*
  $me = *uninitialized*
  $owner = *uninitialized*

它使调试非常容易。

答案 3 :(得分:2)

异常处理程序永远不会访问异常引发的函数的局部变量,因为这些变量是本地的。我认为没有办法从userland PHP代码获取对特定堆栈帧的变量表的访问权。

您可以使用xdebug作为步调试器来执行此操作。使用断点(例如在异常处理程序中),您可以查看每个堆栈帧。

在步骤调试旁边,还有一些您可能想要使用的显示选项,例如:

答案 4 :(得分:2)

您可以访问局部变量,如果异常将在相同的范围/函数中捕获,则抛出它:

<?php

try
{
    $var = 123;
    throw new Exception();
}
catch (Exception $e)
{
    var_dump($var); // int(123)
}

?>

答案 5 :(得分:0)

您可以通过调用函数 get_defined_vars 来全部定义(包括预定义)。

如果没有一些调试工具,就无法使用局部变量(当前函数的范围)。