解析错误:预期捕获 (T_CATCH) 的语法错误


parse error: syntax error expecting catch (T_CATCH)

我是PHP的新手,我正在尝试学习PDO。我正在尝试构建一个页面,我可以在其中将信息(新闻等(发布到数据库,以及另一个页面,我可以在其中查看数据库中的内容。

我在这里读到人们说你不应该使用 try catch 运算符来处理错误消息。我理解这一点,因为您不应该使用以下内容:

创新闻.php

<?php
header("Content-Type: text/html; charset=utf-8");
// Create presets for connection
$dsn = "mysql:host=localhost;dbname=dbname;charset=utf8'";
$opt = array(
    PDO::ATTR_EMULATE_PREPARES   => false,
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
    );
// Check if form is being posted
if ($_SERVER['REQUEST_METHOD'] == "POST") {
// Check if fields are empty
if (!$_POST['name'] || !$_POST['email'] || !$_POST['title'] || !$_POST['content'] || !$_POST['timestamp']) {
    echo "<p>Please fill in all of the fields!</p>";
    exit();
}
else {
    try { // Connects to server and executes the transfer of data
        $pdo = new PDO($dsn, 'root','', $opt);          
        $sth = $pdo->prepare("INSERT INTO news (name, email, title, content, timestamp)
        VALUES (:name, :email, :title, :content, :timestamp)");
        $sth->bindParam(':name', $_POST['name']);
        $sth->bindParam(':email', $_POST['email']);
        $sth->bindParam(':title', $_POST['title']);
        $sth->bindParam(':content', $_POST['content']);
        $sth->bindParam(':timestamp', $_POST['timestamp']);
        $sth->execute();
    }
    catch (PDOException $e) {
        echo $e->getMessage();
    }
    echo "<p>Data submitted successfully!</p><br />To create another post <a href" . $_SERVER['PHP_SELF'] . ">click here</a>";
}
}
// Close the connection
$pdo = null;
?>

所以我删除了上面的捕获PDOException,然后收到错误消息:

解析错误:语法错误、意外的"回显"(T_ECHO(、预期的捕获 (T_CATCH(

如果我删除回声,我仍然会收到"预期捕获T_CATCH错误。

  • 我是否误解了人们说你不应该使用尝试捕获运算符的意思?

  • 如果是这样,我应该如何使用它?

如果您发现代码中有任何我做错或不必要的事情,请随时发表评论。我对这一切很陌生,还在努力学习!:)

谢谢!

我在这里读到人们说你不应该使用 try catch 运算符来处理错误消息。

这些人说得很对。

什么不使用例外

不应将例外用于正常的应用程序流。

让我们看一下 php 手册中的 inverse($x) 函数,如果您以 $x 的形式传入0,它会返回 1/$x 并引发异常,因为您无法除以 0

让我们进一步假设您的变量来自已发布的表单,因此可以输入 0 。在这种情况下,您应该使用 if -子句检查正确的值,例如:

<?php
if (intval($_POST['value']) == 0) {
    echo 'You cannot pass 0 into inverse(). Please enter another value.';
} else {
    echo 'We computed the inverse: ' . inverse(intval($_POST['value']));
}
?>

对于此类用途,不应使用 try-catch 构造。在这种情况下,完全可以预料到用户可能会输入函数无法处理的数字。您应该在正常的应用程序流中检查错误的值并处理它们。

将异常用于什么

现在让我们假设变量 $xsupercomplicated_function 填充,它总是返回一个数字,从不返回0 。既然你确定,变量永远不会等于0,你为什么要检查这种情况?

相反,您可以在此处使用 try-catch:

<?php
$x = supercomplicated_function();
try {
    $y = inverse($x);
    echo 'We computed the inverse: ' . $y;
} catch (Exception $e) {
    echo 'Unexpected situation. Do not know how to go on. Aborting.';
    die();
}
?>

寻找线索

如果在正常情况下预计会出现一些特定错误,则应使用 if 语句检查它们。
如果没有,请让异常处理问题。

在您的情况下,您通常不希望查询执行出现异常。可能的错误原因是 server has gone awaydeadlock 。此错误是可能的,但在"正常"条件下不是。因此,您不想使用 if 语句检查它们(您甚至无法事先检查可能的死锁(。

因此,在您的情况下,您希望使用异常。这完全没问题。