PHP: подскажите, пожалуйста, как применить класс Exception? В документации не могу понять
Начинаю изучение класса Exception, прошу прощения, если вопрос кому-то покажется глупым. Хочу использовать наследование исключений в своем MVC предложении. Создал класс ErrorController, который наследует от встроенного класса Exception. Делаю в нем метод processServError(), чтобы использовать его в других классах для обработки нужной ошибки...
<?php
namespace Controller;
use Throwable;
use View\View;
use \Exception;
class ErrorController extends Exception
{
private static $curlErr;
function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
public static function processServError($curlErr) {
return self::$curlErr;
}
Но когда в другом файле я пытаюсь сослаться на созданный метод таким образом:
if (!empty($curlErr)) {
throw new ErrorController::processServError($curlErr);
} else {
То выкинуть исключение с помощью throw не получается.. Хотя другие статические методы из других статических классов работают нормально...
Как же мне тогда использовать методы с различными ошибками из ErrorController? Подскажите, пожалуйста...
Ответы (1 шт):
То выкинуть исключение с помощью throw не получается.. Хотя другие статические методы из других статических классов работают нормально...
Непонятна исходная постановка задачи и примеров вызова "других статических методов". Ваши ошибки в том, что
Exception- класс исключения. Расширять его следует только если пишете собственное исключение. Следовательно,ErrorControllerявляется исключением. Значит, выбрасывать его надо черезthrow new ErrorController().
Закладывать в название и тело класса исключения алгоритмы и термины, которые не относится к этому исключению -- неправильно и вносит путаницу (хотя и не является ошибкой с на уровне языка). Это применимо к любому классу. Исключение не должно управлять исключениями.
Вы передаёте в
processServError()какое-то значение, никак не используете внутри и возвращаетеself::$curlErr, который вообще не инициализирован;Судя по всему, вы пытаетесь создать динамическое определение имени исключения, которое следует выбрасывать, но в
newне передаёте ни имя класса, ни переменную, его содержащую.
Могу предположить, что вам нужно, например, такое:
<?php
// https://ru.stackoverflow.com/questions/1444784
class MyExc1 extends \Exception {}
class MyExc2 extends \Exception {}
class ExcController
{
private static $map = [
22 => MyExc1::class,
28 => MyExc2::class,
];
public static function getExceptionClassByCode($curlErr) {
return self::$map[$curlErr];
}
public static function throwExceptionByCode($curlErr, $msg) {
throw new self::$map[$curlErr]($msg);
}
}
// обратите внимание на круглые скобки
/* 1 */ throw new (ExcController::getExceptionClassByCode(22)); // throw new (MyExc1);
/* 2 */ throw new (ExcController::getExceptionClassByCode(22))('qwerty'); // throw new (MyExc1)('qwerty')
/* 3 */ ExcController::throwExceptionByCode(22, 'qwerty'); // идентичный результат
Разница в том, что в первых двух примерах мы сначала получаем имя исключения из метода и выбрасываем его. В третьем примере мы выбрасываем исключение, взяв его имя из переменной.