Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ ">

ZOOM::exception and subclasses

The ZOOM::exception class is a virtual base class, representing a diagnostic generated by the ZOOM-C++ library or returned from a server. Its subclasses represent particular kinds of error.

When any of the ZOOM methods fail, they respond by throwing an object of type exception or one of its subclasses. This most usually happens with the connection constructor, the various query constructors, the resultSet constructor (which is actually the searching method) and resultSet::getRecord().

The base class has this declaration:


    class exception {
    public:
      exception (int code);
      int errcode () const;
      const char *errmsg () const;
    };
  

It has three concrete subclasses:

Revised Sample Program

Now we can revise the sample program from the introduction to catch exceptions and report any errors:


    /* g++ -o zoom-c++-hw zoom-c++-hw.cpp -lyaz++ -lyaz */

    #include <iostream>
    #include <yaz++/zoom.h>

    using namespace ZOOM;

    int main(int argc, char **argv)
    {
        try {
            connection conn("z3950.loc.gov", 7090);
            conn.option("databaseName", "Voyager");
            conn.option("preferredRecordSyntax", "USMARC");
            resultSet rs(conn, prefixQuery("@attr 1=7 0253333490"));
            const record *rec = rs.getRecord(0);
            cout << rec->render() << endl;
        } catch (systemException &e) {
            cerr << "System error " <<
                e.errcode() << " (" << e.errmsg() << ")" << endl;
        } catch (bib1Exception &e) {
            cerr << "BIB-1 error " << 
                e.errcode() << " (" << e.errmsg() << "): " << e.addinfo() << endl;
        } catch (queryException &e) {
            cerr << "Query error " <<
                e.errcode() << " (" << e.errmsg() << "): " << e.addinfo() << endl;
        } catch (exception &e) {
            cerr << "Error " <<
                e.errcode() << " (" << e.errmsg() << ")" << endl;
        }
    }
   

The heart of this program is the same as in the original version, but it's now wrapped in a try block followed by several catch blocks which try to give helpful diagnostics if something goes wrong.

The first such block diagnoses system-level errors such as memory exhaustion or a network connection being broken by a server's untimely death; the second catches errors at the Z39.50 level, such as a server's report that it can't provide records in USMARC syntax; the third is there in case there's something wrong with the syntax of the query (although in this case it's correct); and finally, the last catch block is a belt-and-braces measure to be sure that nothing escapes us.

References

Because C does not support exceptions, ZOOM-C has no API element that corresponds directly with ZOOM-C++'s exception class and its subclasses. The closest thing is the ZOOM_connection_error function described in The Connections section of the documentation.