summaryrefslogtreecommitdiffstats
path: root/doc/html/Errors.html
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>1998-07-08 14:54:54 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>1998-07-08 14:54:54 (GMT)
commitbd1e676c521d881b3143829f493a28b5ced1294b (patch)
tree69c50f9fe21ce87f293d8617a6bd51b4cc1e0244 /doc/html/Errors.html
parent73345095897d9698bb1f2f7df830bf80a56dc65a (diff)
downloadhdf5-bd1e676c521d881b3143829f493a28b5ced1294b.zip
hdf5-bd1e676c521d881b3143829f493a28b5ced1294b.tar.gz
hdf5-bd1e676c521d881b3143829f493a28b5ced1294b.tar.bz2
[svn-r467] Restructuring documentation.
Diffstat (limited to 'doc/html/Errors.html')
-rw-r--r--doc/html/Errors.html281
1 files changed, 281 insertions, 0 deletions
diff --git a/doc/html/Errors.html b/doc/html/Errors.html
new file mode 100644
index 0000000..4c3637d
--- /dev/null
+++ b/doc/html/Errors.html
@@ -0,0 +1,281 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+ <head>
+ <title>The Error Handling Interface (H5E)</title>
+ </head>
+
+ <body>
+ <h1>The Error Handling Interface (H5E)</h1>
+
+ <h2>1. Introduction</h2>
+
+ <p>When an error occurs deep within the HDF5 library a record is
+ pushed onto an error stack and that function returns a failure
+ indication. Its caller detects the failure, pushes another
+ record onto the stack, and returns a failure indication. This
+ continues until the application-called API function returns a
+ failure indication (a negative integer or null pointer). The
+ next API function which is called (with a few exceptions) resets
+ the stack.
+
+ <p>In normal circumstances, an error causes the stack to be
+ printed on the standard error stream. The first item, number
+ "#000" is produced by the API function itself and is usually
+ sufficient to indicate to the application programmer what went
+ wrong.
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=top><h4>Example: An Error Message</h4></caption>
+ <tr>
+ <td>
+ <p>If an application calls <code>H5Tclose</code> on a
+ predefined data type then the following message is
+ printed on the standard error stream. This is a
+ simple error that has only one component, the API
+ function; other errors may have many components.
+
+ <p><code><pre>
+HDF5-DIAG: Error detected in thread 0. Back trace follows.
+ #000: H5T.c line 462 in H5Tclose(): predefined data type
+ major(01): Function argument
+ minor(05): Bad value
+ </code></pre>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>The error stack can also be printed and manipulated by these
+ functions, but if an application wishes make explicit calls to
+ <code>H5Eprint()</code> then the automatic printing should be
+ turned off to prevent error messages from being displayed twice
+ (see <code>H5Eset_auto()</code> below).
+
+ <dl>
+ <dt><code>herr_t H5Eprint (FILE *<em>stream</em>)</code>
+ <dd>The error stack is printed on the specified stream. Even if
+ the error stack is empty a one-line message will be printed:
+ <code>HDF5-DIAG: Error detected in thread 0.</code>
+
+ <br><br>
+ <dt><code>herr_t H5Eclear (void)</code>
+ <dd>The error stack can be explicitly cleared by calling this
+ function. The stack is also cleared whenever an API function
+ is called, with certain exceptions (for instance,
+ <code>H5Eprint()</code>).
+ </dl>
+
+ <p>Sometimes an application will call a function for the sake of
+ its return value, fully expecting the function to fail. Under
+ these conditions, it would be misleading if an error message
+ were automatically printed. Automatic printing of messages is
+ controlled by the <code>H5Eset_auto()</code> function:
+
+ <dl>
+ <dt><code>herr_t H5Eset_auto (herr_t(*<em>func</em>)(void*),
+ void *<em>client_data</em>)</code>
+ <dd>If <em>func</em> is not a null pointer, then the function to
+ which it points will be called automatically when an API
+ function is about to return an indication of failure. The
+ function is called with a single argument, the
+ <em>client_data</em> pointer. When the library is first
+ initialized the auto printing function is set to
+ <code>H5Eprint()</code> (cast appropriately) and
+ <em>client_data</em> is the standard error stream pointer,
+ <code>stderr</code>.
+
+ <br><br>
+ <dt><code>herr_t H5Eget_auto (herr_t(**<em>func</em>)(void*),
+ void **<em>client_data</em>)</code>
+ <dd>This function returns the current automatic error traversal
+ settings through the <em>func</em> and <em>client_data</em>
+ arguments. Either (or both) arguments may be null pointers in
+ which case the corresponding information is not returned.
+ </dl>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=top><h4>Example: Error Control</h4></caption>
+ <tr>
+ <td>
+ <p>An application can temporarily turn off error
+ messages while "probing" a function.
+
+ <p><code><pre>
+/* Save old error handler */
+herr_t (*old_func)(void*);
+void *old_client_data;
+H5Eget_auto(&amp;old_func, &amp;old_client_data);
+
+/* Turn off error handling */
+H5Eset_auto(NULL, NULL);
+
+/* Probe. Likely to fail, but that's okay */
+status = H5Fopen (......);
+
+/* Restore previous error handler */
+H5Eset_auto(old_func, old_client_data);
+ </code></pre>
+
+ <p>Or automatic printing can be disabled altogether and
+ error messages can be explicitly printed.
+
+ <p><code><pre>
+/* Turn off error handling permanently */
+H5Eset_auto (NULL, NULL);
+
+/* If failure, print error message */
+if (H5Fopen (....)<0) {
+ H5Eprint (stderr);
+ exit (1);
+}
+ </code></pre>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>The application is allowed to define an automatic error
+ traversal function other than the default
+ <code>H5Eprint()</code>. For instance, one could define a
+ function that prints a simple, one-line error message to the
+ standard error stream and then exits.
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=top><h4>Example: Simple Messages</h4></caption>
+ <tr>
+ <td>
+ <p>The application defines a function to print a simple
+ error message to the standard error stream.
+
+ <p><code><pre>
+herr_t
+my_hdf5_error_handler (void *unused)
+{
+ fprintf (stderr, "An HDF5 error was detected. Bye.\n");
+ exit (1);
+}
+ </code></pre>
+
+ <p>The function is installed as the error handler by
+ saying
+
+ <p><code><pre>
+H5Eset_auto (my_hdf5_error_handler, NULL);
+ </code></pre>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+ <p>The <code>H5Eprint()</code> function is actually just a wrapper
+ around the more complex <code>H5Ewalk()</code> function which
+ traverses an error stack and calls a user-defined function for
+ each member of the stack.
+
+ <dl>
+ <dt><code>herr_t H5Ewalk (H5E_direction_t <em>direction</em>,
+ H5E_walk_t <em>func</em>, void *<em>client_data</em>)</code>
+ <dd>The error stack is traversed and <em>func</em> is called for
+ each member of the stack. Its arguments are an integer
+ sequence number beginning at zero (regardless of
+ <em>direction</em>), a pointer to an error description record,
+ and the <em>client_data</em> pointer. If <em>direction</em>
+ is <code>H5E_WALK_UPWARD</em> then traversal begins at the
+ inner-most function that detected the error and concludes with
+ the API function. The opposite order is
+ <code>H5E_WALK_DOWNWARD</code>.
+
+ <br><br>
+ <dt><code>typedef herr_t (*H5E_walk_t)(int <em>n</em>,
+ H5E_error_t *<em>eptr</em>, void
+ *<em>client_data</em>)</code>
+ <dd>An error stack traversal callback function takes three
+ arguments: <em>n</em> is a sequence number beginning at zero
+ for each traversal, <em>eptr</em> is a pointer to an error
+ stack member, and <em>client_data</em> is the same pointer
+ passed to <code>H5Ewalk()</code>.
+
+ <br><br>
+ <dt><pre><code>typedef struct {
+ H5E_major_t <em>maj_num</em>;
+ H5E_minor_t <em>min_num</em>;
+ const char *<em>func_name</em>;
+ const char *<em>file_name</em>;
+ unsigned <em>line</em>;
+ const char *<em>desc</em>;
+} H5E_error_t;</code></pre>
+ <dd>The <em>maj_num</em> and <em>min_num</em> are major
+ and minor error numbers, <em>func_name</em> is the name of
+ the function where the error was detected,
+ <em>file_name</em> and <em>line</em> locate the error
+ within the HDF5 library source code, and <em>desc</em>
+ points to a description of the error.
+
+ <br><br>
+ <dt><code>const char *H5Eget_major (H5E_major_t <em>num</em>)</code>
+ <dt><code>const char *H5Eget_minor (H5E_minor_t <em>num</em>)</code>
+ <dd>These functions take a major or minor error number and
+ return a constant string which describes the error. If
+ <em>num</em> is out of range than a string like "Invalid major
+ error number" is returned.
+ </dl>
+
+ <p>
+ <center>
+ <table border align=center width="100%">
+ <caption align=top><h4>Example: H5Ewalk_cb</h4></caption>
+ <tr>
+ <td>
+ <p>This is the implementation of the default error stack
+ traversal callback.
+
+ <p><code><pre>
+herr_t
+H5Ewalk_cb(int n, H5E_error_t *err_desc, void *client_data)
+{
+ FILE *stream = (FILE *)client_data;
+ const char *maj_str = NULL;
+ const char *min_str = NULL;
+ const int indent = 2;
+
+ /* Check arguments */
+ assert (err_desc);
+ if (!client_data) client_data = stderr;
+
+ /* Get descriptions for the major and minor error numbers */
+ maj_str = H5Eget_major (err_desc-&gt;maj_num);
+ min_str = H5Eget_minor (err_desc-&gt;min_num);
+
+ /* Print error message */
+ fprintf (stream, "%*s#%03d: %s line %u in %s(): %s\n",
+ indent, "", n, err_desc-&gt;file_name, err_desc-&gt;line,
+ err_desc-&gt;func_name, err_desc-&gt;desc);
+ fprintf (stream, "%*smajor(%02d): %s\n",
+ indent*2, "", err_desc-&gt;maj_num, maj_str);
+ fprintf (stream, "%*sminor(%02d): %s\n",
+ indent*2, "", err_desc-&gt;min_num, min_str);
+
+ return 0;
+}
+ </code></pre>
+ </td>
+ </tr>
+ </table>
+ </center>
+
+
+
+ <hr>
+ <address><a href="mailto:hdf5dev@ncsa.uiuc.edu">Robb Matzke</a></address>
+<!-- Created: Fri Feb 27 23:42:52 EST 1998 -->
+<!-- hhmts start -->
+Last modified: Wed Mar 4 10:06:17 EST 1998
+<!-- hhmts end -->
+ </body>
+</html>