【问题标题】:parse error: syntax error expecting catch (T_CATCH)解析错误:语法错误预期捕获(T_CATCH)
【发布时间】:2014-03-11 00:06:55
【问题描述】:

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

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

CreateNews.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;
?>

于是我去掉了上面的catch PDOException,然后得到了错误信息:

解析错误:语法错误,意外的“回声”(T_ECHO),期待捕获(T_CATCH)

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

  • 当人们说您不应该使用 try catch 运算符时,我是否误解了他们的意思?

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

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

谢谢!

【问题讨论】:

  • 所以你删除了catch,但留下了try?没有捕获就无法尝试...
  • 此外,使用 try/catch 也不错。在整个脚本中只使用一个包罗万象的部分是一种不好的形式。但这与你上面的完全不同。
  • 啊当然。谢谢!我完全错过了尝试仍然存在。那么对于代码的某些部分独立使用catch可以吗?
  • So it's okay to use a catch independently for certain parts of code? 这就是 try/catch 的真正意义……您可以控制如何处理异常
  • try 后面必须跟着 catch。一个好的做法是尝试使用可能会产生错误的代码,仅此而已。

标签: php exception try-catch


【解决方案1】:

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

这些人说的很对。

什么不能使用例外

异常不应用于正常的应用程序流程。

让我们看一下php manual 中的inverse($x) 函数,它返回1/$x,如果你将0 作为$x 传递,则抛出异常,因为你不能除以0

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

<?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 语句检查它们(你甚至不能事先检查可能的死锁)。

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

【讨论】:

  • 哇,它真的阐明了它是如何工作的!谢谢! :)
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2016-01-29
  • 2016-10-26
  • 2013-07-16
  • 2013-06-28
  • 2011-09-22
相关资源
最近更新 更多