为什么php不会在没有抛出异常的情况下进入catch块

时间:2017-05-25 06:29:54

标签: php exception-handling

我是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里面?

1 个答案:

答案 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();
}