Параметры по умолчанию для настраиваемого исключения

В моем проекте symfony4 я хочу генерировать собственные исключения, поэтому я создал Exception Class:

ApiException

namespace App\Utils;


class ApiException extends \Exception
{

    private $class;
    private $function;

    public function __construct(string $message, string $class, string $function, int $code = 0, \Exception $previous = null)
    {

        $this->class = $class;
        $this->function = $function;

        parent::__construct($message, $code, $previous);

    }

    public function __toString()
    {
        return $this->class.'\\'.$this->function.', Line '.$this->line.': '.$this->message;
    }
}

Выбросить исключение

throw new ApiException('Please select a date between 1950 and 2050', __CLASS__, __FUNCTION__);

Выход

App\\Utils\\Api\\by_year, Line 43: Please select a date between 1950 and 2050

что именно так, как я хочу, НО, я бы не хотел передавать __CLASS__ и __FUNCTION__ в моем броске исключения. Куда мне нужно ввести эти два параметра, чтобы они всегда были доступны. Вызов его внутри исключения дает мне имя класса и имя функции класса ExceptionClass, а не класс, который его бросает?

зачем вообще возиться с конструктором? исключение backtrace все равно расскажет вам обо всем этом! Почему бы не отказаться от конструктора и вместо этого просто объединить строку сообщения? throw new ApiException('Please select a date between 1950 and 2050 in ' . __CLASS__, '::' .__FUNCTION__);

delboy1978uk 29.10.2018 11:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

class ApiException extends \Exception
{
    public function __construct(string $message, int $code = 0, \Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);

    }

    public function __toString()
    {
        return $this->getTraceAsString().': '.$this->message;
    }
}

Если вы хотите показать только определенные уровни обратной трассировки, существует также метод getTrace, который возвращает шаги в виде массива, но, на мой взгляд, полная трассировка всегда будет более полезной.

См. Полный пример в https://3v4l.org/UHI08.

Вывод почти идентичен тому, что PHP покажет вам для неперехваченного исключения.

Другие вопросы по теме