Генерация исключений

Последнее обновление: 24.03.2021

PHP по умолчанию представляет ситуации, в которых автоматически генерируются ошибки и исключения, например, при делении на ноль. Но иногда возникает необходимость самим вручную сгенерировать исключение. Например:

class Person
{
	private $name, $age;
	function __construct($name, $age)
	{
		$this->name = $name;
		$this->age = $age;
	}
	function printInfo()
	{
		echo "Name: $this->name<br>Age: $this->age";
	}
}
$tom = new Person("Tom", -105);
$tom->printInfo();

Здесь класс Person через конструктор получает имя и возраст пользователя. Однако в реальности мы можем передать любые значения, например, отрицательный возраст. Понятно, что это недействительное значение. Чтобы избежать подобной ситуации одним из решений является генерация исключения при получении невалидного значения.

Для генерации исключения применяется оператор throw, после которого указывается объект исключения.

Например, изменим выше определенный код класса Person:

class Person
{
	private $name, $age;
	function __construct($name, $age)
	{
		if($age < 0)
		{
			throw new Exception("Недействительный возраст");
		}
		$this->name = $name;
		$this->age = $age;
	}
	function printInfo()
	{
		echo "Name: $this->name<br>Age: $this->age";
	}
}
$tom = new Person("Tom", -105);
$tom->printInfo();

Теперь если возраст отрицательный, то будет генерироваться исключение типа Exception.

throw new Exception("Недействительный возраст");

В качестве параметра конструктор класса Exception получает сообщение об ошибке, которое будет выводиться при возникновении исключения.

В итоге при выполнении строки

$tom = new Person("Tom", -105);

будет выполняться код

throw new Exception("Недействительный возраст");

И в итоге в браузере мы увидем информацию об ошибке:

Fatal error: Uncaught Exception: Недействительный возраст in D:\localhost\hello.php:17 Stack trace: #0 D:\localhost\hello.php(26): Person->__construct('Tom', -105) #1 {main} thrown in D:\localhost\hello.php on line 17

Поскольку вызов конструктора класса Person создает ситуацию, в которой потенциально может возникнуть исключение, то лучше вызов конструктора поместить в конструкцию try..catch:

class Person
{
	private $name, $age;
	function __construct($name, $age)
	{
		$this->name = $name;
		if($age < 0)
		{
			throw new Exception("Недействительный возраст");
		}
		$this->age = $age;
	}
	function printInfo()
	{
		echo "Name: $this->name<br>Age: $this->age";
	}
}

try
{
	$tom = new Person("Tom", -105);
	$tom->printInfo();
}
catch(Exception $ex)
{
	echo $ex -> getMessage();
}

Вывод браузера:

Недействительный возраст

Создание классов исключений

При генерации исключений мы можем полагаться на встроенные классы исключений, как в примере с классом Exception выше. Однако может возникнуть необходимость передать несколько больше информации при генерации или как-то по своему настроить поведение класса исключения. В этом случае мы можем создать свой класс исключения, заточенный под конкретные нужды:

class PersonInvalidAgeException extends Exception
{
	function __construct($age)
	{
		$this -> message = "Недействительный возраст: $age. Возраст должен быть в диапазоне от 0 до 120";
	}
}
class Person
{
	private $name, $age;
	function __construct($name, $age)
	{
		$this->name = $name;
		if($age < 0)
		{
			throw new PersonInvalidAgeException($age);
		}
		$this->age = $age;
	}
	function printInfo()
	{
		echo "Name: $this->name<br>Age: $this->age";
	}
}

try
{
	$tom = new Person("Tom", -105);
	$tom->printInfo();
}
catch(PersonInvalidAgeException $ex)
{
	echo $ex -> getMessage();
}

Для примера здесь определен простенькй класс исключения, который унаследован от класса Exception. (В реальности чтобы создать класс исключения, достаточно реализовать интерфейс Throwable). В этом классе переопределяется конструктор, который в качестве параметра принимает недействительный возраст.

Выводимое значение в классе Exception хранится в свойстве message, соответственно в классе-наследнике PersonInvalidAgeException мы можем использовать это свойство для установки своего сообщения. В итоге при генерации исключения браузер выведет соответствующее сообщение об ошибке:

Недействительный возраст: -105. Возраст должен быть в диапазоне от 0 до 120
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850