在PHP中使用try, throw catch进行错误处理


problem using try, throw catch in PHP for error handling

我第一次在PHP中遇到try, throw catch语句,我觉得这可能是处理错误的更好方式,因为我用很多if else语句弄乱了我的错误处理程序,然而,当我在脚本上执行CRUD操作时,我希望我的错误处理程序执行两个任务。

  1. 显示用户可读或自定义错误消息返回用户。
  2. 捕获文件中的所有错误

我正在使用下面的代码…

try
{
    $name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
    if($cname == $name)
    {
        throw new Exception('Sorry, Please Change the value to update ');
    }
    $sth = $dbh->prepare("UPDATE countries SET name = :name WHERE id = :cid");
    $sth->bindParam(':name', $name);
    $sth->bindParam(':cid', $cid);
    $sth->execute();
}
catch(PDOException $e)
{
    echo $e->getMessage();
    file_put_contents("resources/logs/Connection-log.txt", DATE.PHP_EOL.$e->getMessage().PHP_EOL.PHP_EOL, FILE_APPEND);
}

如果条件$cname == $name为真,我只是想显示错误'对不起,请将值更改为更新,但这不是发生在这里,而是抛出致命错误与此消息。

Fatal error: Uncaught exception 'Exception' with message 'Sorry, Please Change the value to update ' in /Applications/MAMP/htdocs/kokaris/administrator/resources/library/models/countries.php:24 Stack trace: #0 /Applications/MAMP/htdocs/kokaris/administrator/location-manager.php(43): include() #1 {main} thrown in /Applications/MAMP/htdocs/kokaris/administrator/resources/library/models/countries.php on line 24

我如何做到这一点?

谢谢. .

你抓的是一只PDOException:

catch(PDOException $e)

当你扔一个Exception时:

throw new Exception('Sorry, P...


PDOExceptionException的子类,这意味着:

  • PDOExceptionException
  • 但是Exception不是PDOException

因此,当您试图捕获PDOException时,您的catch也不会捕获Exception


如果你想要你的Exception被捕获,你必须使用这样的东西:

try {
} 
catch (PDOException $e) {
  // deal with PDOException
}
catch (Exception $e) {
  // deal with all other kinds of exceptions
}


在这种情况下,catch PDOException可以避免,如果你不想对PDOException s做一些特殊处理,只是希望所有异常都以同样的方式处理:

try {
} 
catch (Exception $e) {
  // deal with all kinds of exceptions
}

你抛出了一个Exception,但是抓住了一个PDOException

你应该捕获和你抛出的一样,所以你可能想把你的捕获改为:

catch(Exception $e)

或者,如果您也想捕获PDOException而不为自己的异常执行file_put_contents,则为特定的Exception添加catch

你当然也可以把你的throw改为PDOException,基本上是一样的。