我试图从这个页面运行这个例子#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";
?>
Run Code Online (Sandbox Code Playgroud)
然而,我得到的不是所需的输出:
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
Run Code Online (Sandbox Code Playgroud)
我使用的开发环境是UniServer 3.5有PHP 5.2.3
Pij*_*usn 206
我只是遇到了这个确切的问题,似乎我甚至复制了异常的名称,但它没有抓住它.事实证明这是我的愚蠢错误,但我认为我应该在这里发布我的案子,以防有其他人处于相同的情况.
我在名为A的名称空间中有异常,脚本位于名为B的名称空间中.问题是我有一个A\MyException等于(在PHP中)\ B\A\MyException(因为我的脚本在名为B的命名空间中!).我需要做的就是修改它的反斜杠(或者它所谓的任何东西)到异常名称,所以它看起来像这样:\ A\MyException
Ene*_*ion 60
相当古老的问题,但......
我也有这个问题(这就是我发现这篇文章的方式),但只是简单的实验让我找到了解决方案.刚刚尝试改变Exception到\Exception.为我工作!
编辑:
正如sivann在评论中指出的那样,使用命名空间应该做同样的事情.所以简单地use \Exception as Exception;在你的课堂宣言之前.
Vla*_*vic 30
试着catch(\Exception $e)代替catch(Exception $e).如果你正在使用一个你不太了解的代码,或者 - 尤其是 - 如果你正在使用一个框架,它可能会覆盖它自己的一个默认的PHP Exception,因此你可能会走错路径并获得不希望的结果.如果您只是放\Exception,那么您确定您正在捕获基本的PHP异常.
Row*_*ego 19
你不能像在C#(Csharp)这样的另一种语言中使用PHP中的典型try {} catch {}块.
如果你这样做:
try{
//division by zero
$number = 5/0;
}
catch(Exception $ex){
echo 'Got it!';
}
Run Code Online (Sandbox Code Playgroud)
你不会看到'得到它'!永远的消息.为什么?这只是因为PHP总是需要一个Exception才能被"抛出".您需要设置自己的错误处理程序并使用它抛出异常.
请参阅set_error_handler函数:http://php.net/manual/es/function.set-error-handler.php
小智 12
\Exception 对我不起作用,但我找到了解决方案。
我需要更换:
try {
...
} catch(Exception $e){
...
}
Run Code Online (Sandbox Code Playgroud)
经过
try {
...
} catch(Throwable $e){
...
}.
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息:https : //trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
如果您使用的是 PHP 7,您可能需要 Throwable 而不是 Exception
小智 6
我的初期是你在捕捉/抛出的异常名称中有一个拼写错误,但如果你的代码完全一样,我不确定到底发生了什么.
尝试对原始脚本进行以下修改,然后粘贴结果.它将有助于更好地诊断您的问题.
<?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';
?>
Run Code Online (Sandbox Code Playgroud)