#define DIVIDE_BY_ZERO -3
int SomeFunction(int a, int b)
{
  if (b == 0)   // can't divide by 0
    XRaise(DIVIDE_BY_ZERO);
  return a / b;
}
void main(void)
{
  XRecord XData;
  XLinkExceptionRecord(&XData);
  switch (setjmp(XData.Context))
  {
    case 0: // this is the code block
      {
        int Result = SomeFunction(7, 0);
        // continue working with Result
      }
      break;
    case DIVIDE_BY_ZERO:
      printf("a division by zero occurred\n");
      break;
    default:
      printf("some other error occurred\n");
      break;
    case XFINALLY:
      printf("cleaning up\n");
  }
  XUnLinkExceptionRecord(&XData);
}

Example 2: setjmp()/longjmp()-based error handling with exception records allocated on the stack.

Back to Article