LINUX.ORG.RU

обработка исключений. как?


0

0

допустим есть некотороя функция в блоке try есть вызов write для 
сокета, как перехватывать исключения созданные в часность функцие 
write?
допустим я написал
try{
  ..тут возможна ошибка...
}
cache(int i){
  cout << i << endl;
}
программа по прежнему валится с криком "Broken pipe". как ваобше 
обрабатывать исключения которые созданны библиотечными вызовами ?
anonymous

Библиотечные вызовы не бросают исключений (это Си-библиотека, а в Си нет исключений). Они возвращают коды ошибок и генерируют сигналы (как раз твой случай). Тебе нужно man sigaction.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Советую Вам сначала почитать Стивенса перед тем, как начать кодить. Или используйте c++ обёртки для соответвуюших протоколов, старайтесь не использовать голых сокетов. Смотрите в сторону ACE.http://www.cs.wustl.edu/~schmidt/ACE.html

krum
()
Ответ на: комментарий от krum

> Советую Вам сначала почитать Стивенса перед тем, как начать кодить. Или используйте c++ обёртки для соответвуюших протоколов, старайтесь не использовать голых сокетов. Смотрите в сторону ACE.http://www.cs.wustl.edu/~schmidt/ACE.html

что-то мне подсказывает, что tailgunner-у уже нет особой необходимости читать Стивенса. впрочем, как и автору оригинального письма смотреть в сторону ACE.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Ну если автор не видит разницы между исключением c++ и сигналами, то ему точно вряд ли нужно программировать на уровне сокетов. А к tailgunnerу мой сообщение вообще никак не относилось.

krum
()

буа-га-га!

надо этого анонимуса на работу в микрософт устроить:)

theserg ★★★
()

Может так ?

int f_write(int id, void* buf, int sizebuf) {
 int retCode=write(id,buf,sizebuf));
 if (retCode<0) {
   char mess[128];  <-- заменить на свой classError или string
   int  errnum = errno;
   sprintf(mess,"error:%d '%s'", 
          errnum, strerror(errnum));
   throw mess;
 } //if()
 return retCode;
} //f_write()

void main() {
 char buf[1024];
 int  retCode=0; 
 try {
  ....
  игнорировать все сигналы
  установить те, которые нужны ->
  посадить на них обработчики
  ...
  retCode = f_write(id, buf, strlen(buf)); 
  ...
 }
 catch(classError &er)
 catch(string &er) {
   ....
 }
 catch(char *p_mess) {
   cout << p_mess << endl;
 }
 catch(...) {
   ....
 }

} //

+ можно посмотреть
man 2 write
идентифицировать errno

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.