Я ввел это в Google, но только нашел практические руководства в C++,
как сделать это в C?
В C вы можете использовать комбинацию функций setjmp ()
и longjmp ()
, определенных в setjmp.h
. Пример из Википедии
#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {
printf("second\n"); // prints
longjmp(buf,1); // jumps back to where setjmp
// was called - making setjmp now return 1
}
void first(void) {
second();
printf("first\n"); // does not print
}
int main() {
if ( ! setjmp(buf) ) {
first(); // when executed, setjmp returns 0
} else { // when longjmp jumps back, setjmp returns 1
printf("main"); // prints
}
return 0;
}
Примечание: Я бы посоветовал вам , а не использовать их, поскольку они ужасно работают с C ++ (деструкторы локальных объектов не вызываются), и это действительно сложно понять, что происходит. Вместо этого верните какую-то ошибку.
В Win с MSVC есть __ попробуйте ... __except ...
но это действительно ужасно, и вы не хотите использовать его, если вы возможно, можно этого избежать. Лучше сказать, что здесь нет исключений.
В C. нет исключений. В C об ошибках сообщает возвращаемое значение функции, выходное значение процесса, сигналы процессу ( Program Error Signals (GNU libc) ) или аппаратное прерывание ЦП (или другая ошибка уведомления ЦП, если она есть) ( Как процессор обрабатывает случай деления на ноль ).
Однако исключения определены в C ++ и других языках. Обработка исключений в C ++ описана в стандарте C ++ «S.15 Exception processing», в стандарте C нет эквивалентного раздела.
Обычный старый C на самом деле изначально не поддерживает исключения.
Вы можете использовать альтернативные стратегии обработки ошибок, такие как:
FALSE
и использование переменной или функции last_error
. См. http://en.wikibooks.org/wiki/C_Programming/Error_handling .
C не имеет исключений.
Существуют различные хакерские реализации, которые пытаются это сделать (один пример на: http://adomas.org/excc/ ).
C не поддерживает исключения. Вы можете попробовать скомпилировать свой код C как C ++ с помощью Visual Studio или G ++ и посмотреть, будет ли он компилироваться как есть. Большинство приложений C будут компилироваться как C ++ без значительных изменений, и затем вы можете использовать синтаксис try ... catch.