powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Исключение с доп.полями в PHP
15 сообщений из 15, страница 1 из 1
Исключение с доп.полями в PHP
    #38666739
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как можно задать для исключения дополнительные поля?
Допустим код вызывает исключение, передавая кроме текстового описания и кода ошибки еще три параметра.
Как эти дополнительные параметры можно передать и отобразить?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38666741
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наследоваться от исключения и деать что хочешь
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38666743
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну создать класс унаследованный от Exception и использовать его
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38666815
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну про наследование я и сам понял.
А как должно быть реализовано в коде?
Дополнительные аргументы в методе-конструкторе?
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38666824
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38666827
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667268
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите еще, из документации не очень понятно.
В классе исключения я могу завершать скрипт? Или exit должен быть снаружи (в блоке catch)?

И что неправильно в коде?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
<?php

// Система исключений для портала

class HotspotException extends Exception
{

	public static $title;
	public $code;
	public $text;
	public $message;

	private $errmsg = array
	(
		'FAIL_DATABASE'     => "Сбой при подключении к базе данных, работа невозможна.",
		...
	);

	function __construct($code, $message = null, Exception $previous = null)
	{
		$text = $this->errmsg[$code];
		$this->code = $code;
		$this->text = $text;
		$this->message = $message;
		parent::__construct((empty($message) ? $text : $message), $code, $previous);
	}

	function __toString()
	{
		return __CLASS__ . ": #{$this->code}: {$this->text}\n";
	}

	function getHTML($only_body = null)
	{
		$html = array();
		if (!$only_body)
		{
			$html[] = '<!DOCTYPE html>';
			$html[] = '<html>';
			$html[] = '<head>';
			$html[] = '<title>' . self::$title . '</title>';
			$html[] = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
			$html[] = '</head>';
			$html[] = '<body>';
		}
		$html[] = '<pre>';
		$html[] = '<strong>#' . $this->code . '</strong>';
		$html[] = $this->text;
		$html[] = '</pre>';
		$text = $this->message;
		if ($text)
		{
			if (!is_array($text)) $text = array($text);
			$html[] = '<div style="font-style:oblique;margin-top:1em;">';
			$last = end(array_keys($text));
			foreach ($text as $i => $s)
			{
				$html[] = htmlspecialchars($s) . ($last == $i ? '' : '<br/>');
			}
			$html[] = '</div>';
		}
		if (!$only_body)
		{
			$html[] = '</body>';
			$html[] = '</html>';
		}
		return implode(PHP_EOL, $html) . PHP_EOL;
	}

}

?>



Бросаю исключение:
Код: php
1.
throw new HotspotException('FAIL_DATABASE');



И получаю ошибку в логе:
Код: plaintext
PHP Fatal error:  Wrong parameters for Exception([string $exception [, long $code [, Exception $previous = NULL]]])
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667327
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получился интересный побочный эффект.
Конструктор своего исключения сделал таким:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
	function __construct($code, $message = null, Exception $previous = null)
	{
		$text = $this->errmsg[$code];
		$this->code = $code;
		$this->text = $text;
		$this->message = $message;
		parent::__construct((empty($message) ? $text : $message), 0, $previous);
	}



Обработчик написан так:
Код: php
1.
2.
3.
4.
5.
catch (HotspotException $e)
{
	echo $e->getHTML();
	exit(0);
}



Бросаю исключение так:
Код: php
1.
throw new HotspotException('FAIL_DATABASE')



И при этом получаю вывод сообщения:
#FAIL_DATABASE
Сбой при подключении к базе данных, работа невозможна.

Сбой при подключении к базе данных, работа невозможна.


То есть в HotspotException почему-то свойство message переписывается этим свойством родителя Exception.
Отчего так происходит и как это исключить?
Если в конструкторе HotspotException закомментировать создание исключения родителя, тогда перезаписи свойства message не происходит, но возможно так делать нельзя.
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667704
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ты вообще сам читаешь, что ты пишешь???
ладно в пхп коде не читаешь, но на форуме на русском. ничего же не понятно без циклического прочтения твоего потока сознания.

parent::__construct((empty($message) ? $text : $message), 0, $previous);

ЗЫ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
заходит мужик в лифт, и другой следом за ним. 
- слушай мужик, хоч я тебе фокус покажу, только для этого мне надо палец тебе в попу
засунуть.
-ну ладно показывай.
засунул значит палец, и второй
- ну а фокус то в чом?!
- а ручки то вот они!!!

анекдот явно не про данный случай. здесь нет фокуса, или эффекта интересного. здяся програмирование детка, как на писано, так и выполниться. :)

ЗЫЗЫ
обычно принято, инициализирующие методы родителя, в потомках вызывают родительский вначале...тоесть сначала инициализация общая(родительская) потом своё добавляем

в завершающих методах наоборот.

ибо в инициализирующих, наша инициализация может зависеть от родительской, последняя точно не зависит от нашей.

ЗЫЗЫЗЫ
в переопределённом конструкторе порядок параметров перепутан, можно но лудше сохранять оригинальный, разве что дополнив своими вконце
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667746
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что в конструкторе у вас вызвано


Код: php
1.
parent::__construct((empty($message) ? $text : $message), $code, $previous);



вот он на экран тоже выводит, как я понимаю :)
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667803
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПотому что в конструкторе у вас вызвано


Код: php
1.
parent::__construct((empty($message) ? $text : $message), $code, $previous);



вот он на экран тоже выводит, как я понимаю :)

не там по вёрстке у него двойной вывод... один раз текст, один раз месседж, но так как при пустом меседже,
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667885
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
специально проверил сейчас, проблема в вызове конструктора предка...
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38667986
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettвот он на экран тоже выводит, как я понимаю :)
Не совсем.
При выполнении этой строки изменяется свойство message моего класса.

Если на пальцах, то у моего исключения есть три свойства: код ошибки (code), текст ошибки (text) и подробности ошибки (message), причем текст ошибки вызывающей стороной не задается, он определяется исключительно кодом ошибки. Когда я вызываю конструктор родителя, я передаю в него сообщение об ошибке, оно должно соответствовать message (если задано) или text (если message не задано).
Например я вызываю исключение с кодом FAIL_DATABASE и без дополнительного описания. То есть code='FAIL_DATABASE', text='Сбой подключения к БД', message=null. Родительское исключение при этом должно вызваться с параметрами message='Сбой подключения к БД", code=0. Но оно при этом обновляет свойство message уже моего класса, то есть после вызова конструктора родителя у меня получается code='FAIL_DATABASE', text='Сбой подключения к БД', message='Сбой подключения к БД', хотя message я сам не изменял.
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38668073
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так и откуда второе сообщение?
...
Рейтинг: 0 / 0
Исключение с доп.полями в PHP
    #38668096
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое второе?
Там одно сообщение.
Текст повторяется дважды поскольку message=text, но я такого присвоения не делал
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Исключение с доп.полями в PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]