dzheka3d
@dzheka3d

Как обрабатывают ошибки в классах?

Всем привет! Пытаюсь овладеть классами и вот задался вопросом... есть такой вот простенький класс:
class Ports
{
	private $db;
	
	public function __construct($db)
	{
		$this->db = $db;
	}
	
	private function AddPort($port) // записываем название порта в базу
	{
		$port = $this->db->real_escape_string($port);
		$res = $this->db->query("INSERT INTO `ports` (`name`) VALUES('{$port}')");
		return $this->db->insert_id;
	}
	
	public function Port($port) // Проверяем существование порта
	{
		$port = $this->db->real_escape_string(trim($port));
		$res = $this->db->query("SELECT `id` FROM `ports` WHERE `name` = '{$port}' LIMIT 1");
		
		if($res->num_rows == 1){
			$row = $res->fetch_assoc();
			return $row['id'];
		}else{
			$port_id = $this->AddPort($port);
			return $port_id;	
		}
	}
}

Из вне, я вызываю метод Port которому передаю в параметрах название порта (морской порт к примеру). Метод проверяет наличие такого названия в базе и возвращает его id в случае удачи. Если такого порта не существует, вызываем метод AddPort и передаем ему название порта, там порт добавляется в базу и метод AddPort возвращает id добавленной записи. И тут вопрос: "Как должна работать логика, если вдруг, по каким-то причинам AddPort не вернет id добавленной записи? Это простой пример, но ведь цепочка может быть большая, то как вывести ошибку пользователю где именно код сработал не верно?"

Другими словами, нужно вставить проверку сюда:
if($this->db->query("INSERT INTO `ports` (`name`) VALUES('{$port}')")){
//continue
}else{
 "Не удалось добавить запись"; // не понятно, куда добавить эту информацию, чтобы она аккуратно вывелась пользователю и приостановила весь скрипт.
}
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) ошибки происходят не в классах. Разберитесь в чем разница между объектами и классами, что есть что и что для чего.

2) исключения.
Ответ написан
Комментировать
@IceJOKER
Web/Android developer
во-первых - начните название методов с маленькой буквы и пишите в стиле camelCase.
во-вторых - дайте методам говорящие названия, а не Port - что за метод? лучше бы назвали getPortId или getPort, или checkPort и т.д.

а насчет вопроса - если не вернул, значит не смог добавить порт, если не смог, значит возвращаем ошибку и останавливаем работу. + вы можете написать отправку письма на почту, чтоб в случае проблем вас оповещали.

[sarcasm]ИЛИ ЖЕ запускаете в цикле до тех пор пока не добавится :D будьте настойчивы![/sarcasm]
Ответ написан
@danforth
Я конечно не гуру в PHP, но сделал бы так:
- написал бы класс DBException который наследовал бы PDOException
- все операции с БД проводил через PDO
- во время отрабатывания метода query делал бы try - catch.
- если проскакивает ошибка, собрал бы лог и куда-то бы сохранил

Но в вашем случае можно просто try catch воспользоватся
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы