如果发生 pdo 异常,是否可以执行剩余的代码?

时间:2021-06-26 17:36:48

标签: php pdo error-handling

我有一个 config.php 文件,如下所示:

const buttons = Array.from(document.querySelectorAll(".field"))
const boardData = [];
const func = () => {
    if ((xTurn && checkWin(player1) || checkWin(player2))) {
        freezeBoard(field, func);
    }
};
buttons.forEach(button => {
    button.addEventListener("click", func)
});
function freezeBoard(buttons) {
    buttons.forEach(button => {
        button.removeEventListener("click", func);
    })
}

现在我在 index.php 中包含了这个文件,如下所示:

//file name: config.php -------------
define ("DOMAIN","mydomain.com");
//connection parameters
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_SILENT,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo "Database connected successfully!";
} catch (PDOException $e) {
    throw new PDOException($e->getMessage());
}

如您所见,凭据是假的,将无法连接到数据库,因此错误消息如下所示:

//file name: index.php -----------
require_once("../path to/config.php");
echo "WELCOME to <h1 style='display:inline;color:#000080;'>".DOMAIN."</h1>";

我在这里删除了实际路径,但提到了路径的布局。一切正常..错误信息也正常。

但是我想要的是,index.php 的第一行将被执行/显示(欢迎来到 mydomain.com),即使包含文件的一部分(这里是连接部分)会出现错误。由于定义 DOMAIN 并从 index.php 回显它没有错误,我希望它显示“欢迎使用 mydomain.com”,然后显示从 pdo 连接捕获的错误消息。

怎么做?

2 个答案:

答案 0 :(得分:2)

您不应该在生产服务器上显示任何错误 - 您应该记录它。如果您没有使用任何框架,您可以简单地将其保存到文件中而不是显示它 - 在 catch 块中完成所有操作。

此外,您还要捕获并再次抛出相同的异常。

} catch (PDOException $e) {
    throw new PDOException($e->getMessage());
}

请自行编辑此部分以进行处理。

答案 1 :(得分:1)

 //file name: config.php -------------
 define ("DOMAIN","mydomain.com");
 //connection parameters
 $host = '127.0.0.1';
 $db   = 'test';
 $user = 'root';
 $pass = '';
 $charset = 'utf8mb4';

 $pdo_error = 0;
 $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
 $options = [
     PDO::ATTR_ERRMODE            => PDO::ERRMODE_SILENT,
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
     PDO::ATTR_EMULATE_PREPARES   => false,
 ];
 try {
     $pdo = new PDO($dsn, $user, $pass, $options);
     echo "Database connected successfully!";
 } catch (PDOException $e) {
     //throw new PDOException($e->getMessage());
     $pdo_error = 1;
     $error_message = $e->getMessage();
 }

然后

//file name: index.php -----------
require_once("../path to/config.php");
echo "WELCOME to <h1 style='display:inline;color:#000080;'>".DOMAIN."</h1>";
if($pdo_error){
    throw new PDOException($error_message);
}