c++libjpeg

Error handling in libjpeg


I am using the C++ JPEG library (libjpeg) and I have realized that when some functions fail exit() is called and the application is closed. How can I override this behavior and prevent the application from closing on libjpeg errors?


Solution

  • This is the default behavior of libjpeg. In order to handle errors with libjpeg, you'll have to define an error handling routine like this:

    struct jpegErrorManager {
        /* "public" fields */
        struct jpeg_error_mgr pub;
        /* for return to caller */
        jmp_buf setjmp_buffer;
    };
    char jpegLastErrorMsg[JMSG_LENGTH_MAX];
    void jpegErrorExit (j_common_ptr cinfo)
    {
        /* cinfo->err actually points to a jpegErrorManager struct */
        jpegErrorManager* myerr = (jpegErrorManager*) cinfo->err;
        /* note : *(cinfo->err) is now equivalent to myerr->pub */
    
        /* output_message is a method to print an error message */
        /*(* (cinfo->err->output_message) ) (cinfo);*/      
        
        /* Create the message */
        ( *(cinfo->err->format_message) ) (cinfo, jpegLastErrorMsg);
    
        /* Jump to the setjmp point */
        longjmp(myerr->setjmp_buffer, 1);
      
    }
    

    And then register it using jpeg_std_error.

    FILE* fileHandler;
    /* ... */
    struct jpeg_decompress_struct cinfo;
    jpegErrorManager jerr;
    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = jpegErrorExit;
    /* Establish the setjmp return context for my_error_exit to use. */
    if (setjmp(jerr.setjmp_buffer)) {
        /* If we get here, the JPEG code has signaled an error. */
        cerr << jpegLastErrorMsg << endl;
        jpeg_destroy_decompress(&cinfo);
        fclose(fileHandler);
        return 1;
    }
    

    You can find a complete example here.