This example shows how DosError and DosErrClass handle errors. Run this program without a diskette in drive A: so that the DosOpen call fails with a "device not ready" condition, or run it with a disk there for a "file not found" condition.

 #define INCL_DOSFILEMGR   /* File Manager values */
 #define INCL_DOSERRORS    /* DOS error values    */
 #define INCL_DOSMISC      /* DOS miscellaneous   */
 #include <os2.h>
 #include <stdio.h>

 int main(VOID) {
 UCHAR        uchFileName[80] = "A:\\NONEXIST.ZQX"; /* File to fail on      */
 HFILE        hfConfig      = 0;             /* Handle for Config file      */
 ULONG        ulOpenAction  = 0,             /* Action taken by DosOpen     */
              ulErrorClass  = 0,             /* Type of error encountered   */
              ulErrorAction = 0,             /* Action warranted by error   */
              ulErrorLoc    = 0;             /* Where error occurred        */
 APIRET       rc            = NO_ERROR,      /* Return code                 */
              DosOpenRc     = NO_ERROR;      /* Return code from DosOpen    */

  rc = DosError(FERR_DISABLEHARDERR); /* Suppress error window.  If this is
                                         omitted, OS/2 will put up an error
                                         window asking the user to intervene */
  if (rc != NO_ERROR) {
     printf("DosError error: return code = %u\n", rc);
     return 1;
  }
  DosOpenRc = DosOpen(uchFileName,          /* File to open (path and name) */
               &hfConfig,                   /* File handle returned         */
               &ulOpenAction,               /* Action taken by DosOpen      */
               0L,0L,        /* Primary allocation and attributes (ignored) */
               OPEN_ACTION_FAIL_IF_NEW |
               OPEN_ACTION_OPEN_IF_EXISTS,  /* Open an existing file only   */
               OPEN_SHARE_DENYNONE   |
               OPEN_ACCESS_READWRITE,       /* Read and write access        */
               0L);                         /* Extended attributes(ignored) */

    if (DosOpenRc == NO_ERROR) {
        printf("DosOpen successful... but it should have failed.\n");
        return 1;
    } else {
      rc = DosErrClass(DosOpenRc,           /* Return code from failing API */
                       &ulErrorClass,       /* Class of error               */
                       &ulErrorAction,      /* Action to take for error     */
                       &ulErrorLoc);        /* Where did the error occur?   */

      if (rc != NO_ERROR) {
          printf("DosErrClass error: return code = %u\n", rc);
          return 1;
      } else {
          printf("rc= %u  ErrorClass= %u  ErrorLoc= %u\n",
                  DosOpenRc, ulErrorClass, ulErrorLoc);

          printf("ErrorAction= %u means: ", ulErrorAction);
          switch (ulErrorAction) {
           case(ERRACT_RETRY):  printf("Retry immediately");    break;
           case(ERRACT_DLYRET): printf("Retry after a delay");  break;
           case(ERRACT_USER):   printf("Incorrect user input"); break;
           case(ERRACT_ABORT):  printf("Terminate in an orderly fashion");
                                                                break;
           case(ERRACT_PANIC):  printf("Terminate NOW");        break;
           case(ERRACT_IGNORE): printf("Ignore this error");    break;
           case(ERRACT_INTRET): printf("Retry after user intervenes");
                                                                break;
           default:             printf("Unknown error action"); break;
          } /* switch */
          printf("\n");
      }
   }  /* DosOpen failure */

  rc = DosError(FERR_ENABLEHARDERR);        /* Re-enable error window */
  if (rc != NO_ERROR) {
     printf("DosError error: return code = %u\n", rc);
     return 1;
  }

  return NO_ERROR;
}


[Back] [Next]