@Hfnas

Как передать ошибку пользователю из класса?

Доброго всем дня.

Подскажите, пожалуйста, как передать ошибку из 1 класса другому классу b, который вызвал 1класс? мне нужно вывести в попап ошибку из класса b .

try{
$cnt=0;
if ($cnt<0){
throw new Exception("нулевое количество");
}
} catch(Exception $e){
$this->errors=$e->getMessage();
            return array("errors"=>$this->errors);

}

Дебаг почему-то останавливается на строчке throw new Exception("нулевое количество"); -а дальше не пошел, а также `finally` не помог.

Наверное, придется плодить if else....
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
ПО-моему, исключения обычно используют по-другому: в одном месте их кидают, а в другом - ловят. Вот вам пример:
class A {

    /**
     * A constructor.
     * @throws Exception
     */
    public function __construct()
    {
        // $cnt откуда-то берется...
        $cnt = 0;
        if ( $cnt < 1 ) {
            throw new Exception("нулевое количество");
        }
    }
}

class B {

    private $errors = array();

    public function run()
    {
        try {
            $a = new A();
        } catch (Exception $e) {
            $this->errors[] = $e->getMessage();
        }

        return array("errors"=>$this->errors);
    }
}

Если по какой-то причине нельзя кидать исключение из конструктора ( уже не помню, но может быть для старых версий PHP это было плохо), то просто выносите код инициализации объекта в другой метод, а конструктор делаете пустым:
class A {
    /**
     * A constructor.
     */
    public function __construct()
    {
    }

    /**
     * @throws Exception
     */
    public function init()
    {
        // $cnt откуда-то берется...
        $cnt = 0;
        if ( $cnt < 1 ) {
            throw new Exception("нулевое количество");
        }
    }
}

class B {

    private $errors = array();

    public function run()
    {
        try {
            $a = new A();
            $a->init();
        } catch (Exception $e) {
            $this->errors[] = $e->getMessage();
        }

        return array("errors"=>$this->errors);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
php666
@php666
PHP-макака
при использовании механизма исключений никаких return не должно быть
отучайтесь мыслить функциями и их возможностями
Ответ написан
Ninazu
@Ninazu
Можно ловить все ошибки в одном месте

<?php

class Response {

	public function sendResponse(array $data) {
		echo json_encode($data);

		return true;
	}

	public function sendError(string $message) {
		echo json_encode(['error' => $message]);

		return false;
	}
}

class ErrorHandler {

	private $response;

	public function __construct(Response $response) {
		$this->response = $response;
	}

	public function handlerError($error_code, $message, $file = null, $line = null) {
		if ($error_code) {
			throw new Exception($message, $error_code);
		}

		return true;
	}

	public function handlerShutdown() {
		$error = error_get_last();

		if ($error) {
			$this->handlerException(new Error($error['message'], $error['type']));
		}

		exit(0);
	}

	public function handlerException(Throwable $exception) {
		if (ob_get_length()) {
			ob_end_clean();
		}

		if (!headers_sent()) {
			return $this->response->sendError($exception->getMessage());
		}

		return true;
	}
}

$response = new Response();
$handler = new ErrorHandler($response);
register_shutdown_function([$handler, 'handlerShutdown']);
set_error_handler([$handler, 'handlerError']);
set_exception_handler([$handler, 'handlerException']);

#region Logic

$cnt = 0;

if ($cnt === 0) {
	throw new Exception("Нулевое количество");
}

#endregion

$response->sendResponse([
	'message' => "Всё окей"
]);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
N1.RU Новосибирск
от 100 000 руб.
Living Core Казань
от 50 000 руб.
Алгоритмика Москва
от 110 000 до 160 000 руб.