PHP Try Catch в обработке исключений

У меня есть класс базы данных dbconnect.php и processform.php. Внутри dbconnect.php есть метод для подключения к базе данных.

Если есть ошибка, как я могу вызвать исключение? Где я могу поместить блок try catch в файл processform.php? Люди говорят, что я не должен отражать ошибку прямо из класса. Вот пример:

    <?php

// dbconnect.php

class DbConnect
{

public function open_connection()
{

/* Should I do it like this? */
$this->conn = PDO($dsn, $this->username, $this->password);
if (!$this->conn) {
throw new Exception('Error connecting to the database.');
}

/* Or like this */
try {
$this->conn = PDO($dsn, $this->username, $this->password);
} catch (PDOException $e) {
echo 'Error: ', $e->getMessage(), '<br>';
}
}
?>

// processform.php

<?php
require_once 'dbconnect.php';
$pdo = new DbConnect($host, $username, $password);
try {
$pdo->open_connection();
} catch (PDOException $e) {
echo 'Error connecting to the database.');
}
?>

Я действительно хочу узнать, как правильно реализовать попытку try в моем коде.

0

Решение

Вам не нужно создавать исключение вручную, особенно при успешном соединении 🙂

Вместо этого вам нужно сообщить PDO, что он должен выдавать исключения, когда что-то идет не так, и вы можете сделать это, когда открываете соединение с базой данных:

$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$this->conn = new PDO($dsn, $this->username, $this->password, $options);

Теперь вы можете положить все в try / catch блоки, но это даже не нужно; если вы этого не сделаете, php покажет вам unhandled exceptions завершите с трассировкой стека, когда вы не ловите их вручную.

И когда вы решите, что хотите настроить обработку ошибок для своих посетителей, вы можете установить свой собственный обработчик исключений, используя set_exception_handler(). Таким образом, вы можете обрабатывать все в одном месте, а не оборачивать различные разделы в try / catch блоки. Если вы предпочитаете это, конечно.

1

Другие решения

В своей практике я предпочитаю ловить исключения в нижней части. Я имею в виду второй способ в вашем DbConnect.

Вы можете вывести сообщение об ошибке в журнал ошибок. И верните код ошибки во внешний интерфейс. Таким образом, интерфейс знает, как сообщить пользователям, что ошибка происходит по-дружески.

Более того, вы можете использовать глобальный обработчик ошибок, такой как set_error_handler/set_exception_handler сделать это. Перенаправить на страницу ошибки, когда ошибка происходит.

0

По вопросам рекламы [email protected]