簡體   English   中英

PHP 中的 Try/Catch 塊未捕獲異常

[英]Try/Catch block in PHP not catching Exception

我正在嘗試從此頁面運行此示例 #1: http : //php.net/manual/en/language.exceptions.php

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}
try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>

但是,我得到的不是所需的輸出:

0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.' 
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7

我使用的開發環境是UniServer 3.5 with PHP 5.2.3

我只是遇到了這個確切的問題,似乎我什至復制了異常的名稱,但它沒有抓住它。 結果證明這是我的愚蠢錯誤,但我認為我應該在這里發布我的案例,以防其他人處於相同的情況。

我在名為A 的命名空間中有異常,腳本位於名為B的命名空間中。 問題是我有A\\MyException等於(在 PHP 中) \\B\\A\\MyException (因為我的腳本在名為B的命名空間中!)。 我所要做的就是在異常名稱中添加反斜杠(或任何名稱),使其看起來像這樣: \\A\\MyException

很老的問題,但...

我也有這個問題(這就是我發現這篇文章的方式)但只是簡單的實驗讓我找到了解決方案。 只需嘗試將Exception更改為\\Exception 為我工作!

編輯:

正如 sivann 在評論中指出的那樣,使用命名空間應該做同樣的事情。 所以簡單地把use \\Exception as Exception; 在你的類聲明之前。

嘗試放置catch(\\Exception $e)而不是catch(Exception $e) 如果您正在使用您不太了解的代碼,或者 - 特別是 - 如果您使用的是框架,它可能會用自己的一個覆蓋默認的 PHP 異常,因此您可能會走錯路並得到不希望的結果。 如果您只是放置\\Exception ,那么您肯定會捕獲基本的 PHP 異常。

您不能在 PHP 中使用典型的 try{} catch{} 塊,就像在 C# (Csharp) 等另一種語言中一樣。

如果你這樣做:

try{
    //division by zero
    $number = 5/0;
}
catch(Exception $ex){
    echo 'Got it!';
}

您不會看到“知道了!” 消息從不。 為什么? 這只是因為 PHP 總是需要一個異常來“拋出”。 您需要設置自己的錯誤處理程序並用它拋出異常。

參見set_error_handler函數: http : //php.net/manual/es/function.set-error-handler.php

\\Exception對我不起作用,但我找到了解決方案。

我需要更換:

  try {
   ...
  } catch(Exception $e){
   ...
  } 

經過

  try {
   ...
  } catch(Throwable $e){
   ...
  }.

欲了解更多信息: https : //trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/

如果您使用的是 PHP 7,您可能需要 Throwable 而不是 Exception

我最初的想法是您在捕獲/拋出的異常的名稱中有一個錯字,但是如果您的代碼完全相同,我不確定到底發生了什么。

嘗試對原始腳本進行以下修改,並粘貼您的結果。 這將有助於更好地診斷您的問題。

<?php

//set up exception handler to report what we didn't catch
function exception_handler($exception) {

    if($exception instanceof MyException) {
        echo "you didn't catch a myexception instance\n";

    } else if($exception instanceof Exception) {
        echo "you didn't catch a exception instance\n";

    } else {
        echo "uncaught exception of type: ".gettype($exception)."\n";
    }

    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

//install the handler
set_exception_handler('exception_handler');

class MyException extends Exception {
}

function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (MyException $e) {
    echo 'Caught myexception: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>

我在以下配置中遇到了同樣的問題,

PHP 5.2.14 (cli)(構建時間:2010 年 8 月 12 日 17:32:30) 版權所有 (c) 1997-2010 PHP Group Zend Engine v2.2.0,版權所有 (c) 1998-2010 Zend Technologies with eAccelerator v0.9.5。 1 , 版權所有 (c) 2004-2006 eAccelerator,由 eAccelerator

解決方案是禁用 eAccelerator 或更新它。 我嘗試了兩者,兩個修復程序都有效。 該錯誤在此處報告https://eaccelerator.net/ticket/242 (注意。firefox 抱怨他們的 SSL 證書)。

現在我正在使用以下配置正確運行 try catch,

PHP 5.2.4 (cli)(構建時間:2007 年 10 月 16 日 09:13:35) 版權所有 (c) 1997-2007 PHP Group Zend Engine v2.2.0,版權所有 (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6。 1 , 版權所有 (c) 2004-2010 eAccelerator,由 eAccelerator

在 Xdebug 中有一個設置:

xdebug.show_exception_trace = 1

即使在 try catch 塊中,這也將強制 php 輸出異常。 將其設為0

捕獲php中的所有異常

 try
 {
   //place code
   throw new Exception('foo');//eg
 }
  catch (\Throwable $e) 
 { 
   dd('for php 7');
 } catch (\Exception $e) 
 { 
    dd('for php 5');
 }

https://www.php.net/manual/en/language.exceptions.php

TLDR; 確保你有use Exception; 在兩個 php 文件的頂部

也許嘗試禁用您可能已安裝的某些 3rd 方擴展? http://bugs.php.net/bug.php?id=41744

我也在經歷這個。 我閱讀了 Rowinson Gallego 的評論,其中必須拋出狀態異常。 所以我修改了我的代碼:

try
{
  $number = 5/0; //or other exception
}
catch(Exception $e)
{
  throw $e;
}

進入 :

try
{
  $number = 5/0; //or other exception
}
catch(Exception $e)
{
  throw new Exception($e->getMessage(),$e->getCode());
}

有用。

就我而言,一個奇怪的情況發生,並且捕捉Exception ,當我有沒有連工作\\Exception 以下是確保您不會錯過任何內容並始終捕獲錯誤的方法。

 catch (\Exception $e) {
        // do what you want to do on exception catching
 } catch (\Throwable $e) {
        // do what you want to do on exception catching 
 }

當您將這兩者結合起來時,您將永遠不會錯過捕獲Exception 確保將\\放在ExceptionThrowable之前。 這很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM