@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....
  • Вопрос задан
  • 158 просмотров
Решения вопроса 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' => "Всё окей"
]);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
04 апр. 2020, в 21:01
35000 руб./за проект
04 апр. 2020, в 20:32
5000 руб./за проект
04 апр. 2020, в 20:30
25000 руб./за проект