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

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
10.06.2014, 18:09
    #38666741
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
наследоваться от исключения и деать что хочешь
...
Рейтинг: 0 / 0
10.06.2014, 18:09
    #38666743
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Ну создать класс унаследованный от Exception и использовать его
...
Рейтинг: 0 / 0
10.06.2014, 19:28
    #38666815
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Ну про наследование я и сам понял.
А как должно быть реализовано в коде?
Дополнительные аргументы в методе-конструкторе?
...
Рейтинг: 0 / 0
10.06.2014, 19:38
    #38666824
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
да
...
Рейтинг: 0 / 0
10.06.2014, 19:39
    #38666827
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
...
Рейтинг: 0 / 0
11.06.2014, 11:00
    #38667268
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Подскажите еще, из документации не очень понятно.
В классе исключения я могу завершать скрипт? Или 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
11.06.2014, 11:35
    #38667327
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Получился интересный побочный эффект.
Конструктор своего исключения сделал таким:
Код: 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
11.06.2014, 15:02
    #38667704
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Alibek B.,

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

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

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

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

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

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

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

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


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



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


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



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

не там по вёрстке у него двойной вывод... один раз текст, один раз месседж, но так как при пустом меседже,
...
Рейтинг: 0 / 0
11.06.2014, 16:42
    #38667885
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
специально проверил сейчас, проблема в вызове конструктора предка...
...
Рейтинг: 0 / 0
11.06.2014, 17:57
    #38667986
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
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
11.06.2014, 19:23
    #38668073
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Ну так и откуда второе сообщение?
...
Рейтинг: 0 / 0
11.06.2014, 19:46
    #38668096
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение с доп.полями в PHP
Какое второе?
Там одно сообщение.
Текст повторяется дважды поскольку message=text, но я такого присвоения не делал
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Исключение с доп.полями в PHP / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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