View file delta_framework-main/core/lib/Core/CoreException.class.php

File size: 6.29Kb
<?php
    /**
     * Copyright (c) 2022 Roman Grinko <[email protected]>
     * Permission is hereby granted, free of charge, to any person obtaining
     * a copy of this software and associated documentation files (the
     * "Software"), to deal in the Software without restriction, including
     * without limitation the rights to use, copy, modify, merge, publish,
     * distribute, sublicense, and/or sell copies of the Software, and to
     * permit persons to whom the Software is furnished to do so, subject to
     * the following conditions:
     * The above copyright notice and this permission notice shall be included
     * in all copies or substantial portions of the Software.
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     */

    namespace Core;

    use Core\Helpers\SystemFunctions;
    use Throwable;

    class CoreException extends \Exception
    {
        /**
         * Некорректный идентификатор пользователя
         */
        const ERROR_INCORRECT_USER_ID = 100;

        /**
         * Пользователь не найден
         */
        const ERROR_USER_NOT_FOUND = 101;

        /**
         * Ошибка создания пользователя
         */
        const ERROR_CREATE_USER = 200;

        /**
         * Ошибка добавления ролей пользователю
         */
        const ERROR_ADD_USER_ROLES = 201;

        /**
         * Ошибка отправки кода верификации пользователю
         */
        const ERROR_SEND_VERIFICATION_CODE = 202;

        /**
         * Ошибка проверки класса или метода на существование
         */
        const ERROR_CLASS_OR_METHOD_NOT_FOUND = 300;

        /**
         * Ошибка проверки класса или метода на существование
         */
        const ERROR_DIPLICATE_TASK = 400;

        /**
         * Ошибка файл не найден
         */
        const ERROR_FILE_NOT_FOUND = 500;

        /**
         * Ошибка не удалось скопировать файл
         */
        const ERROR_FILE_COPY = 501;

        /**
         * Ошибка SQL запроса
         */
        const ERROR_SQL_QUERY = 600;

        /**
         * @param string|null $message Сообщение
         * @param int         $code    Код исключения
         *
         * @throws self
         */
        public function __construct($message = null, $code = 0)
        {
            if (!$message) {
                throw new static('Неопознанное исключение: '. get_class($this));
            }
            parent::__construct($message, $code);
        }

        /**
         * Возвращает обработанный callTrace текущего исключения
         *
         * @return array
         */
        public function generateCallTrace(): array
        {
            $trace = explode(PHP_EOL, $this->getTraceAsString());
            $trace = array_reverse($trace);
            array_shift($trace);
            $length = count($trace);
            $result = [];
            for ($i = 0; $i < $length; $i++) {
                $result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' '));
            }
            return $result;
        }

        /**
         * Отображение исключения пользователю
         *
         * @return void
         */
        public function showTrace(): void
        {
            echo '<div style="color: #b30000;background: #ffe2e2;padding: 10px;border: 1px solid #ffa0a0;margin: 10px;display: inline-block;">';
            echo '<span style="font-weight:bold; font-size: 1.1em;">' . $this->getMessage() . '</span><br>';
            echo $this->getFile() . ': ' . $this->getLine() . '<br>';
            $arTrace = $this->generateCallTrace();
            foreach ($arTrace as $key => $value) {
                echo '<span>' . $value . '</span><br>';
            }
            echo '</div>';
        }

        /**
         * Отображение окна трассировки
         * @param array  $trace Трассировка
         * @param string $message Сообщение
         *
         * @return void
         */
        private static function printTraceBox(array $trace, string $message): void
        {
            echo '<div class="showDetailTrace" style="font-size: 0.9em;">';
            echo '<span style="padding: 10px;font-size: 1.2em;color: red;">' . $message . '</span>';
            foreach ($trace as $k => $traceLine) {
                if (file_exists($traceLine['file'])) {
                    echo '<div style="padding: 10px;border: 1px solid #c7c7c7;background: #f7f7f7;">';
                    echo '<div><span style="font-weight: bold;font-size: 1.16em;">#' . $k . ' ' . $traceLine['file'] . '</span>';
                    echo SystemFunctions::getFilePreviewByLine(file_get_contents($traceLine['file']), $traceLine['line']);
                    echo '</div></div>';
                }
            }
            echo '</div>';
        }

        /**
         * Отображение детального описания исключения
         *
         * @return void
         */
        public function showDetailTrace(): void
        {
            self::printTraceBox($this->getTrace(), $this->getMessage());
        }

        /**
         * Отображение детального описания исключения из стороннего исключения
         * @param Throwable $exception Объект исключения
         *
         * @return void
         */
        public static function showDetailTraceFromException(Throwable $exception)
        {
            self::printTraceBox($exception->getTrace(), $exception->getMessage());
        }

    }