【问题标题】:Exception not catching in try/catch block在 try/catch 块中未捕获异常
【发布时间】:2017-08-17 04:22:42
【问题描述】:

try/catch 块不起作用有什么原因吗?

我在 try catch 块内调用 Magento2 API 中的一个方法,但它没有捕获异常并且执行停止并且我看到堆栈跟踪。

这是我的代码:

        $productModel = $this->productRepository->getById( $pId );

        $debpt = "";
        try{
            $debpt = $productModel->getCustomAttribute('depart_num')->getValue();
        }
        catch(\Exception $ex){
            $debpt = $ex->getMessage();
        }

getValue() 方法导致异常,但我的 try/catch 没有捕获它。

这是堆栈跟踪:

( ! ) Fatal error: Uncaught Error: Call to a member function getValue() on null in /var/www/nwl/app/code/Raleigh/CustomReports/Controller/Report/Generate.php on line 118
( ! ) Error: Call to a member function getValue() on null in /var/www/nwl/app/code/Raleigh/CustomReports/Controller/Report/Generate.php on line 118
Call Stack
#   Time    Memory  Function    Location
1   0.0093  383800  {main}( )   .../index.php:0
2   1.2357  12558448    Magento\Framework\App\Bootstrap->run( ??? ) .../index.php:39
3   1.2362  12560232    Magento\Framework\App\Http->launch( )   .../Bootstrap.php:258
4   2.3292  22376480    Magento\Framework\App\FrontController\Interceptor->dispatch( ??? )  .../Http.php:135
5   2.3302  22464168    Magento\Framework\App\FrontController\Interceptor->___callPlugins( ???, ???, ??? )  .../Interceptor.php:26
6   2.3302  22467712    Infortis\Cgen\Plugin\Magento\Framework\App\FrontController->aroundDispatch( ???, ???, ??? ) .../Interceptor.php:142
7   2.3305  22469480    Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}( ??? )  .../FrontController.php:32
8   2.3305  22469856    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Interceptor.php:138
9   2.3313  22499968    Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch( ???, ???, ??? )  .../Chain.php:67
10  2.3314  22501304    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../BuiltinPlugin.php:68
11  2.3314  22501680    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
12  2.3315  22504744    Magento\PageCache\Model\App\FrontController\VarnishPlugin->aroundDispatch( ???, ???, ??? )  .../Chain.php:67
13  2.3315  22504744    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../VarnishPlugin.php:55
14  2.3315  22505120    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
15  2.3318  22517640    Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch( ???, ???, ??? )  .../Chain.php:67
16  2.4050  22671616    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../DbStatusValidator.php:69
17  2.4050  22671992    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
18  2.4053  22677224    Magento\Store\App\FrontController\Plugin\RequestPreprocessor->aroundDispatch( ???, ???, ??? )   .../Chain.php:67
19  2.4067  22697128    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../RequestPreprocessor.php:94
20  2.4067  22697504    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
21  2.4067  22697544    Magento\Framework\App\FrontController\Interceptor->___callParent( ???, ??? )    .../Chain.php:70
22  2.4067  22697544    Magento\Framework\App\FrontController\Interceptor->dispatch( ??? )  .../Interceptor.php:74
23  2.6148  27411640    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->dispatch( ??? )   .../FrontController.php:55
24  2.6158  27438408    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->___callPlugins( ???, ???, ??? )   .../Interceptor.php:26
25  2.6303  29018384    Magento\Tax\Model\App\Action\ContextPlugin->aroundDispatch( ???, ???, ??? ) .../Interceptor.php:142
26  2.6303  29018384    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->Magento\Framework\Interception\{closure}( ??? )   .../ContextPlugin.php:91
27  2.6303  29018760    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Interceptor.php:138
28  2.6367  30050392    Magento\Weee\Model\App\Action\ContextPlugin->aroundDispatch( ???, ???, ??? )    .../Chain.php:67
29  2.6367  30050392    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../ContextPlugin.php:112
30  2.6367  30050768    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
31  2.6368  30052808    Magento\Store\App\Action\Plugin\StoreCheck->aroundDispatch( ???, ???, ??? ) .../Chain.php:67
32  2.6368  30052808    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../StoreCheck.php:44
33  2.6368  30053184    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
34  2.6369  30055776    Magento\Customer\Model\App\Action\ContextPlugin->aroundDispatch( ???, ???, ??? )    .../Chain.php:67
35  2.6372  30081328    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../ContextPlugin.php:61
36  2.6372  30081704    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
37  2.6373  30085880    Magento\Store\App\Action\Plugin\Context->aroundDispatch( ???, ???, ??? )    .../Chain.php:67
38  2.6448  30193896    Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}( ??? )   .../Context.php:106
39  2.6448  30194272    Magento\Framework\Interception\Chain\Chain->invokeNext( ???, ???, ???, ???, ??? )   .../Chain.php:63
40  2.7299  30787752    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->___callParent( ???, ??? ) .../Chain.php:70
41  2.7299  30787752    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->dispatch( ??? )   .../Interceptor.php:74
42  2.7385  31511040    Raleigh\CustomReports\Controller\Report\Generate\Interceptor->execute( )    .../Action.php:102

我不知道如何解决这个问题。 API 类没有任何方法来检查值以避免 null 错误,我的 try/catch 块不起作用。

有人知道为什么 try/catch 可能不起作用吗?

【问题讨论】:

    标签: php magento2


    【解决方案1】:

    代码不是在抛出Exception,而是在抛出Error,这就是你无法捕捉到它的原因。

    例如,您可以先检查 $productModel->getCustomAttribute('depart_num') 是否为空

    if ($productModel->getCustomAttribute('depart_num') !== null) { // do your logic
    

    或者,如果您使用的是 PHP 7+(我认为您是),您可以修改您正在捕获的内容,因为现在 Errors are catchable:

    catch (\Error $e) {
    

    【讨论】:

    • 谢谢老兄,它有效! (我会在时限用完后接受)
    • @Guerrilla 我刚刚再次偶然发现了这个问题并重新阅读了它。我编辑了它,你也可以捕捉到错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多