IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Обработка исключений (Ada), Разделено
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


В тему исключений (а то я стесняюсь заводить по 10 тем в день).
Как повесить на исключение дополнительную информацию?

А то получается такая фигня:

...
if ... then
error_flag := ... -- целое, может принимать 1000 разных значений, не заводить же по исключению на каждое
raise My_Exception_With_Flag;
end if;
...
when My_Exception_With_Flag =>
Put_Line(Integer'Image(error_flag));
...


Совмещение подхода исключений и кодов ошибок в одном флаконе!


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Вообще-то обычно строку (как сообщение об ошибке) передают в исключение. Но можно и номер ошибки в строку перевести...

...
if ... then
error_flag := ... -- целое
raise My_Exception_With_Flag with error_flag'Img; -- забрасываем как строку
end if;
...
when Ex : My_Exception_With_Flag =>
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Message (Ex)); -- Вот оно и напечатает номер ошибки
when Ex : others =>
Ada.Text_IO.Put("Oops...");
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Но можно и номер ошибки в строку перевести...

А перевести что-то посложнее, типа структуру какую-нибудь? Кроме побайтового отображения в строку мне ничего в голову не приходит, может, дельфиновый опыт так сказывается. Но всё это очень небезопасно и бесконтнольно, и контролируемые объекты таким образом лучше не передавать. А если бы компилятор знал, что с данным типом исключения всегда идёт такая-то структура, то можно было бы на стадии компиляции отследить.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Но всё это очень небезопасно и бесконтнольно, и контролируемые объекты таким образом лучше не передавать.
Вот именно поэтому Ада не позволяет передавать ничего, кроме строки. Кому-то захочется передавать лимитированные типы, кому-то - тип функциональный, кто-то задумает тэговый передать... А там, глядишь, недалеко и до типов, экспортированных из других языков. Это что будет в результате? Анархия.

По-моему, кто-то опять забыл, что такое исключение. Это не механизм для передачи информации из одной части программы в другую. Это - механизм для оповещения, что на каком-то этапе произошла ошибка, и дальнейшая обработка информации - бессмысленна, надо либо повторить попытку, либо завершить программу. Всё, больше исключения не должны использоваться ни для чего. А для оповещения достаточно передать строку с описанием исключительной ситуации. В самом крайнем случае можно передать в виде строки код ошибки, или индекс ошибочного элемента в каком-нибудь хранилище (желательно - глобальном, ибо при использовании локального к нему может не быть доступа в той точке, где исключение поймается). Но передавать сам элемент - этого в языке не было и не будет никогда. И я это поддерживаю.

Хотя попытки реализаций передачи объектов, разумеется были. Если интересно - попробую найти, где-то у меня есть в загашниках...

Тему разделил.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.01.2021 17:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name