попробуй поймать внутри или вокруг функции & amp; использовать try-catch при каждом выполнении запроса или нет?

Я прочитал несколько тем на stackoverflow об этих вопросах:

  1. Должен ли я использовать try-catch внутри или вокруг функции query?
  2. Должен ли я использовать try-catch при каждом выполнении запроса или нет?

И, если честно, я не уверен, что понимаю ответы — кто-то говорит да, кто-то говорит нет. Итак, я хочу привести практический пример того, как я это делаю … и если бы вы могли дать мне ответы на эти два вопроса.

database.php:

try {
$connection= new PDO(DB_DNS, DB_USER, DB_PASS);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(Exception $e) {
echo "Error: ".$e->getMessage();
die();
}

user.php:

class User {
public function pronadjiSveUsere() {
global $connection;
$sql= $connection->prepare("SELECT * FROM users");
$result = $sql->execute();
return $result ;
}

public function find_by_id($id=0) {
global $connection;
$sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
$result = $sql->execute(array($id));
return $result->fetch(PDO::FETCH_OBJ);
}
}

Как видите, у пользователя класса есть два метода. Мои вопросы:

1. Должен ли я использовать try-catch вообще в этих случаях?
2. Если ответ — да, я должен поставить в рамках методов, например:

    public function find_by_id($id=0) {
try {
global $connection;
$sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
$result = $sql->execute(array($id));
return $result->fetch(PDO::FETCH_OBJ);
} catch(Exception $e) {
echo $e->getMessage();
die();
}
}

или около того, всякий раз, когда я использую эти методы, например:

try {
user->find_by_id($id);
} catch(Exception $e) {
echo $e->getMessage();
die();
}

Заранее спасибо!

1

Решение

Вы можете писать книги на эту тему. На самом деле я верю там являются книги на эту тему. Так что я буду держать это очень кратко.
Для всех ваших фрагментов кода я бы сказал нет — с возможный исключение для последнего.
Первый: database.php не должен принимать решение, продолжать или нет. Таким образом, блок «поймай / умри» можно даже считать злом. Особенно при безоговорочной печати «настоящего» сообщения об ошибке. Некоторый верхний уровень может захотеть попробовать другое соединение. Или напечатайте причудливое сообщение «извините, что-то пошло не так. Мы изо всех сил стараемся вернуть Яддаядду». Или делать что можно без базы данных. (Возможно, это возможно. Это не так, если database.php позволяет экземпляру php умереть).
Тот же аргумент для вашего пользователя класса. Если что-то (интеллектуальное) не может сделать код внутри пользователя с исключением, которое он должен избегать при обработке. [Печать сообщения об ошибке + die is не обработка исключения.
Опять же, довольно маловероятно (хотя и не невозможно), что сами методы могут разумно смягчить проблему, поэтому держитесь подальше от исключения; какой-то другой, верхний слой должен иметь дело с этим в любом случае.

Таким образом, обрабатывать исполнение, только если вы Можно действительно справиться с этим.
edit: Но иногда это хорошая идея, чтобы «преобразовать» фактическое исключение в то, что интересует верхний слой. Тогда у вас будет блок catch, который на самом деле не обрабатывает исключение, но создает новое (если возможно, включая оригинальное исключение) и выбрасывает его.

2

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

Если вам нужно останавливать приложение каждый раз, когда ваш запрос завершается неудачно и выдает Exception — попробуйте использовать функцию php set_exception_handler и удалите все свои блоки try … catch для PDO в коде. Эта функция регистрирует глобальный обработчик для всех необработанных исключений. Но
Например

<?php
set_exception_handler(function ($e) {
// Processing only PDOExceptions
if ($e instanceof PDOException) {
echo $e->getMessage();
die();
} else {
throw $e;//do not process other exceptions
}
});
?>

Эту функцию нужно вызывать перед любым из запросов Sql.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector