2017-08-17 57 views
1

爲什麼try/catch塊不起作用?在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可能不起作用?

回答

3

該代碼沒有投擲Exception,它拋出Error,這就是爲什麼你無法捕捉它。

,例如你可以檢查是否$ productModel-> getCustomAttribute( 'depart_num')爲空第一

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

另外,如果你使用PHP 7+(我想你),你可以修改你所捕捉的,從現在開始Errors are catchable

catch (\Error $e) { 
+0

謝謝你,它的工作! (我會接受時間限制後) – Guerrilla

+1

@Guerrilla我只是偶然發現了這個問題,並重新閱讀它。我編輯它,你也可以捕獲錯誤。 – ishegg