реклама на сайте
подробности

 
 
> Ошибки функций... и последствия, C builder 2006
toweroff
сообщение Dec 21 2011, 17:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Даже не знаю, как обозвать тему sm.gif

Все что угодно соединяется. Выдается ID
вызываем функцию, которая в канал связи или пытается передать, или пытается получить оттуда
но что-то не получилось
Функция вернет ошибку (или количество байт не то, которое ждали)

Таких вызовов много

Как правильно сделать одну секцию ошибок, которая сделает (в зависимости от ошибки) одно действие, или несколько секций кода для разных ошибок?

Как это правильно делается, дабы каждый раз не плодить условий при вызове функций обмена?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
toweroff
сообщение Dec 21 2011, 19:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Я к чему
Обойтись можно средствами C или только C++ (try, catch, throw)?
Как удобнее .....?
мда.. отклик соседней ветки


Привычка делать на C рождает вопросы sm.gif
Go to the top of the page
 
+Quote Post
Tiro
сообщение Dec 21 2011, 20:29
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(toweroff @ Dec 21 2011, 22:18) *
Обойтись можно средствами C или только C++ (try, catch, throw)?
Как удобнее .....?
Привычка делать на C рождает вопросы sm.gif

Все равно независимо от использования С или С++ Вы переберете все ошибки, которые хотите обработать. Разница, насколько я помню, в том, что в С Вы должны заранее задать все ошибки и их обработать, с необработанными Вы сами решите, как поступать; а в С++ есть механизм передачи необработанных ошибок в объект-родитель, можете добавить обработчики в объект-родитель. Как будет короче - виднее только Вам.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 21 2011, 20:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Tiro @ Dec 22 2011, 00:29) *
Все равно независимо от использования С или С++ Вы переберете все ошибки, которые хотите обработать. Разница, насколько я помню, в том, что в С Вы должны заранее задать все ошибки и их обработать, с необработанными Вы сами решите, как поступать; а в С++ есть механизм передачи необработанных ошибок в объект-родитель, можете добавить обработчики в объект-родитель. Как будет короче - виднее только Вам.

объекта-родителя НЕТ
есть просто функция, которая _может_ возвратить некоторую ошибку
хрошо, с кодами ошибок и с описаниями для пользователя - не вопрос
как (и можно ли) это сделать на C ?
это, фактически, вопрос не только к билдеру, но и к embedded, типа 32flash и 4-8RAM
Go to the top of the page
 
+Quote Post
Tiro
сообщение Dec 21 2011, 20:57
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(toweroff @ Dec 21 2011, 23:42) *
объекта-родителя НЕТ
есть просто функция, которая _может_ возвратить некоторую ошибку
хрошо, с кодами ошибок и с описаниями для пользователя - не вопрос
как (и можно ли) это сделать на C ?
это, фактически, вопрос не только к билдеру, но и к embedded, типа 32flash и 4-8RAM

Обработка должна выполняться в вызывающей функции, так как вызываемая может и не знать контекста ошибки. Можно вести что-то вроде связанного списка кодов завершения, в том числе ошибок, а при возникновении ошибки обрабатывать связанный список назад.
Отступление: другой интересный механизм был предложен в сервере Apache, там место под локальные данные выделялось из динамической памяти и при неустранимой ошибке все это просто уничтожалось.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 21 2011, 21:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Tiro @ Dec 22 2011, 00:57) *
Обработка должна выполняться в вызывающей функции, так как вызываемая может и не знать контекста ошибки. Можно вести что-то вроде связанного списка кодов завершения, в том числе ошибок, а при возникновении ошибки обрабатывать связанный список назад.
Отступление: другой интересный механизм был предложен в сервере Apache, там место под локальные данные выделялось из динамической памяти и при неустранимой ошибке все это просто уничтожалось.

да понятно, что функция что-то вернет, с обработкой тоже
ну не ваять же каждый раз

Код
if (send2channel(structure, sizeof(structure)) != sizeof(structure)) goto _l_fullass;


или
Код
if (send2channel(structure, sizeof(structure)) == FULLASS) goto _l_fullass;


потому как дальше нет смысла что-то делать
Go to the top of the page
 
+Quote Post
Tiro
сообщение Dec 21 2011, 21:42
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(toweroff @ Dec 22 2011, 00:16) *
да понятно, что функция что-то вернет, с обработкой тоже
ну не ваять же каждый раз

Код
if (send2channel(structure, sizeof(structure)) != sizeof(structure)) goto _l_fullass;


или
Код
if (send2channel(structure, sizeof(structure)) == FULLASS) goto _l_fullass;


потому как дальше нет смысла что-то делать

Это Вы ваяете в вызываемой функции, тут все равно, какой язык.

С трассировкой вызовов

===============
send2channel (...)
{
...
if (received_counter != requested_counter) return ERROR_PACKET_SIZE;
...
}

caller_send2channel (...)
{
if (!send2channel(...)) handle_error (*from_caller, *error_queue и прочее)
}
==========

Это если есть трассировка цепочки вызовов.

Так как бы Вы хотели обработать ошибку, каким обработчиком-то? Или хотите, чтобы компилятор все сам сделал?

Все равно придется придумать механизм трассировки вызовов и отката назад по ошибкам. Это может быть отдельный модуль, может быть обработчик в вызывающей функции, все равно. Что С, что С++ без разницы. Такое ИМХО.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- toweroff   Ошибки функций... и последствия   Dec 21 2011, 17:32
- - aaarrr   Да, обработка ошибок на каком-то этапе неизбежно у...   Dec 21 2011, 21:28
- - XVR   Вам нужно, что бы было одно место, через которое в...   Dec 22 2011, 10:33
- - kolobok0   Цитата(toweroff @ Dec 21 2011, 21:32) ......   Dec 23 2011, 08:21
- - _Pasha   Цитата(toweroff @ Dec 21 2011, 20:32) Даж...   Dec 23 2011, 12:32
- - toweroff   Поясню Есть функция (точнее - несколько), в котор...   Dec 23 2011, 14:16
|- - _Pasha   Цитата(toweroff @ Dec 23 2011, 18:16) Так...   Dec 25 2011, 05:33
|- - toweroff   Цитата(_Pasha @ Dec 25 2011, 09:33) Видим...   Dec 25 2011, 08:53
- - Flexz   Да нормально вполне, если не ошибаюсь, например, в...   Dec 23 2011, 15:36
|- - aaarrr   Цитата(Flexz @ Dec 23 2011, 19:36) Кодret...   Dec 25 2011, 18:58
- - toweroff   Я и спрашиваю про ББ, про embedded просто удочка з...   Dec 23 2011, 15:42
- - Flexz   Цитата(aaarrr @ Dec 25 2011, 22:58) Это е...   Dec 26 2011, 06:39
- - aaarrr   Ресурсом совсем не обязательно являются объекты в ...   Dec 26 2011, 07:43
- - Flexz   Ну это понятно. Подход-то от этого не меняется.   Dec 26 2011, 07:54


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 21:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016