Использование функций обратного вызова для обработки ошибок в C - PullRequest
2 голосов
/ 04 июня 2009

Я размышлял о трудностях, возникающих при обработке ошибок C .. как, например, кто на самом деле

if(printf("hello world")==-1){exit(1);}

Но вы нарушаете общие стандарты, не делая такого многословного и обычно бесполезного кодирования. А что если у вас есть обертка вокруг libc? так, чтобы вы могли сделать что-то вроде ..

//main...
error_catchall(my_errors);
printf("hello world"); //this will automatically call my_errors on an error of printf
ignore=1; //this makes it so the function will return like normal and we can check error values ourself
if(fopen.... //we want to know if the file opened or not and handle it ourself.
}

int my_errors(){
   if(ignore==0){
      _exit(1); //exit if we aren't handling this error by flagging ignore
   }
return 0;
//this is called when there is an error anywhere in the libc
}
...

Я подумываю сделать такую ​​обертку, поскольку я синтезирую свой собственный лицензированный BSD libc (так что я уже должен коснуться неприкасаемого ...), но я хотел бы знать, что люди думают об этом .. будет ли это на самом деле работать в реальной жизни и будет более полезным, чем возвращать -1?

Ответы [ 4 ]

2 голосов
/ 04 июня 2009

за эти годы я видел несколько попыток имитировать попытку / поймать в ANSI C:

Я думаю, что подход try / catch более прост, чем ваш.

1 голос
/ 04 июня 2009

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

Для этого вам понадобятся две версии каждой функции. Один, который перехватил ошибки, а другой - ошибки возврата.

Я давно делал что-то подобное, не изменяя библиотеку. Я только что создал функции-обертки для обычных вызовов, которые делали проверку ошибок. Таким образом, мой вызов errchk_malloc проверил возврат и выдал ошибку, если распределение не удалось. Тогда я просто использовал эту версию везде вместо встроенного malloc.

0 голосов
/ 05 июня 2009

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

Например, Gnome использует g_malloc и g_try_malloc. Первая будет прервана при неудаче, а вторая просто выдаст нулевой указатель, такой как malloc.

0 голосов
/ 04 июня 2009

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

Чтобы избежать подобных проблем, я иногда использую LD_PRELOAD_PATH для интеграции управления ошибками (только для моих собственных проектов, поскольку это не очень хорошая практика ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...