co89757
11/25/2015 - 3:27 AM

Exceptions in C using setjmp/longjmp

Exceptions in C using setjmp/longjmp

/**
 * EXAMPLE 1: TRY/CATCH/THROW
*/

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>


#define TRY do{ jmp_buf env; if(!setjmp(env)) {
#define CATCH } else {
#define END_TRY } }while(0)
#define THROW longjmp(env, 1)

int main(int argc, char *argv[]) {

  TRY {
    printf("In TRY statement\n");
    THROW;
    printf("not reachable\n");
  }
  CATCH {
    printf("exception caught\n");
  }
  END_TRY;

  exit(EXIT_SUCCESS);
}



/** EXAMPLE2: MULTIPLE CATCHES */
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>


#define FOO_EXCEPTION (1)
#define BAR_EXCEPTION (2)
#define GOO_EXCEPTION (3)

#define TRY do{ jmp_buf env; switch(setjmp(env)) { case 0:
#define CATCH(exception) break; case exception:
#define END_TRY } }while(0)
#define THROW(exception) longjmp(env, exception)

int main(int argc, char *argv[]) {

  TRY {
    printf("In TRY statement\n");
    THROW(GOO_EXCEPTION);
    printf("not reachable\n");
  }
  CATCH(FOO_EXCEPTION) {
    printf("FOO exception caught\n");
  }
  CATCH(BAR_EXCEPTION) {
    printf("BAR exception caught\n");
  }
  CATCH(GOO_EXCEPTION) {
    printf("GOO exception caught\n");
  }
  END_TRY;

  exit(EXIT_SUCCESS);
}


/** FINALLY BLOCK */

#define FOO_EXCEPTION (1)
#define BAR_EXCEPTION (2)
#define GOO_EXCEPTION (3)

#define TRY do{ jmp_buf env; switch(setjmp(env)) { case 0: while(1) {
#define CATCH(exception) break; case exception:
#define FINALLY break; } default:
#define END_TRY } }while(0)
#define THROW(exception) longjmp(env, exception)

int main(int argc, char *argv[]) {

  TRY {
    printf("In TRY statement\n");
    THROW(GOO_EXCEPTION);
    printf("not reachable\n");
  }
  CATCH(FOO_EXCEPTION) {
    printf("FOO exception caught\n");
  }
  CATCH(BAR_EXCEPTION) {
    printf("BAR exception caught\n");
  }
  CATCH(GOO_EXCEPTION) {
    printf("GOO exception caught\n");
  }
  FINALLY {
    printf("Finally \n");
  }
  END_TRY;

  exit(EXIT_SUCCESS);
}