我是php新手,我来自java背景,我想知道为什么php不会直接在try块中发生异常而不会手动抛出异常。 e.g。
<?php
//create function with an exception
function checkNum($number) {
if($number/0) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
在上面的例子中if if条件中出现除零异常然后它会直接转到catch块而不是if.why里面?
答案 0 :(得分:2)
您发布的代码并不是您所说的。
执行时:
if ($number/0)
除以零打印警告,然后返回false
。由于该值不是真实的,因此它不会进入if
块,因此它不会执行throw
语句。然后该函数返回true
。由于没有抛出异常,执行调用checkNum(2)
后的语句,因此它会打印消息。
当我运行你的代码时,我得到输出:
Warning: Division by zero in scriptname.php on line 5
If you see this, the number is 1 or below
PHP没有使用异常进行内置错误检查。它只是显示或记录错误,如果它是一个致命的错误,它会停止脚本。
但是在PHP 7中已经改变了。它现在通过抛出类型Error
的异常来报告错误。这不是Exception
的子类,因此如果您使用catch (Exception $e)
则不会被捕获,您需要使用catch (Error $e)
。见Errors in PHP 7。所以在PHP 7中你可以写:
<?php
//create function with an exception
function checkNum($number) {
if($number/0) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Error $e) {
echo 'Message: ' .$e->getMessage();
}