[英]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');
}
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
。 確保將\\
放在Exception
和Throwable
之前。 這很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.