<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>GDAL: cpl_error.h File Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.6.2-20100208 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> </div> <div class="contents"> <h1>cpl_error.h File Reference</h1><code>#include "<a class="el" href="cpl__port_8h_source.html">cpl_port.h</a>"</code><br/> <p><a href="cpl__error_8h_source.html">Go to the source code of this file.</a></p> <table border="0" cellpadding="0" cellspacing="0"> <tr><td colspan="2"><h2>Defines</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a40ae27078f2a969a445daa022405cf72"></a><!-- doxytag: member="cpl_error.h::CPLAssert" ref="a40ae27078f2a969a445daa022405cf72" args="(expr)" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLAssert</b>(expr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3124d964a0472dc8df1ad61533258a97"></a><!-- doxytag: member="cpl_error.h::VALIDATE_POINTER_ERR" ref="a3124d964a0472dc8df1ad61533258a97" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>VALIDATE_POINTER_ERR</b> CE_Failure</td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><b>VALIDATE_POINTER0</b>(ptr, func)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><b>VALIDATE_POINTER1</b>(ptr, func, rc)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a231a41d3e8f2522f477435ee1232512f"></a><!-- doxytag: member="cpl_error.h::CPLE_None" ref="a231a41d3e8f2522f477435ee1232512f" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_None</b> 0</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7151d0699caa1372a8566562390ff113"></a><!-- doxytag: member="cpl_error.h::CPLE_AppDefined" ref="a7151d0699caa1372a8566562390ff113" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_AppDefined</b> 1</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aec7dba1acbad288d224d52a2b3ef990c"></a><!-- doxytag: member="cpl_error.h::CPLE_OutOfMemory" ref="aec7dba1acbad288d224d52a2b3ef990c" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_OutOfMemory</b> 2</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4930c3e715b2dd2899e38ebb52e60d9f"></a><!-- doxytag: member="cpl_error.h::CPLE_FileIO" ref="a4930c3e715b2dd2899e38ebb52e60d9f" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_FileIO</b> 3</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a730735f3bab3514071f6a8642910ea75"></a><!-- doxytag: member="cpl_error.h::CPLE_OpenFailed" ref="a730735f3bab3514071f6a8642910ea75" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_OpenFailed</b> 4</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a07b0e6c2d300ba2d03743024b6fe109d"></a><!-- doxytag: member="cpl_error.h::CPLE_IllegalArg" ref="a07b0e6c2d300ba2d03743024b6fe109d" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_IllegalArg</b> 5</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3a532186d9f9e2699aee57aab0648b5e"></a><!-- doxytag: member="cpl_error.h::CPLE_NotSupported" ref="a3a532186d9f9e2699aee57aab0648b5e" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_NotSupported</b> 6</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a13990dad8417da7119ef2ca2f324d582"></a><!-- doxytag: member="cpl_error.h::CPLE_AssertionFailed" ref="a13990dad8417da7119ef2ca2f324d582" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_AssertionFailed</b> 7</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ada4b0a770e1eaef3d23a55c760a3f4a0"></a><!-- doxytag: member="cpl_error.h::CPLE_NoWriteAccess" ref="ada4b0a770e1eaef3d23a55c760a3f4a0" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_NoWriteAccess</b> 8</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adea9ed24efa030e441e087db671f3fae"></a><!-- doxytag: member="cpl_error.h::CPLE_UserInterrupt" ref="adea9ed24efa030e441e087db671f3fae" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_UserInterrupt</b> 9</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8aa83034499fe5f18b9c77622d924d60"></a><!-- doxytag: member="cpl_error.h::CPLE_ObjectNull" ref="a8aa83034499fe5f18b9c77622d924d60" args="" --> #define </td><td class="memItemRight" valign="bottom"><b>CPLE_ObjectNull</b> 10</td></tr> <tr><td colspan="2"><h2>Typedefs</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac5c827a6f16be7ff3bcb776fe8979360"></a><!-- doxytag: member="cpl_error.h::CPLLoggingErrorHandler" ref="ac5c827a6f16be7ff3bcb776fe8979360" args="(CPLErr, int, const char *)" --> typedef const char *void </td><td class="memItemRight" valign="bottom"><b>CPLLoggingErrorHandler</b> (CPLErr, int, const char *)</td></tr> <tr><td colspan="2"><h2>Enumerations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>CPLErr</b> { <br/> <b>CE_None</b> = 0, <b>CE_Debug</b> = 1, <b>CE_Warning</b> = 2, <b>CE_Failure</b> = 3, <br/> <b>CE_Fatal</b> = 4 <br/> }</td></tr> <tr><td colspan="2"><h2>Functions</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af3b801aa6c512c9de6846c9a46e70794"></a><!-- doxytag: member="cpl_error.h::CPLError" ref="af3b801aa6c512c9de6846c9a46e70794" args="(CPLErr eErrClass, int err_no, const char *fmt,...) CPL_PRINT_FUNC_FORMAT(3" --> void </td><td class="memItemRight" valign="bottom"><b>CPLError</b> (CPLErr eErrClass, int err_no, const char *fmt,...) CPL_PRINT_FUNC_FORMAT(3</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad98e14124e0bd4ff3611203e35902171"></a><!-- doxytag: member="cpl_error.h::CPLErrorV" ref="ad98e14124e0bd4ff3611203e35902171" args="(CPLErr, int, const char *, va_list)" --> void void </td><td class="memItemRight" valign="bottom"><b>CPLErrorV</b> (CPLErr, int, const char *, va_list)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a29626fd8fdb658b19439beeb73a59560">CPLErrorReset</a> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a198afe56aced1d73226880aa90d39b99">CPLGetLastErrorNo</a> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">CPLErr </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a8df0d4e01034cf79202314c92251e920">CPLGetLastErrorType</a> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a7f71ade3bb0a0e9e45802975ec59ff5e">CPLGetLastErrorMsg</a> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0650d409ed9130ae2f1c6a49a23be765"></a><!-- doxytag: member="cpl_error.h::void" ref="a0650d409ed9130ae2f1c6a49a23be765" args="(1 *CPLErrorHandler)(CPLErr" --> typedef </td><td class="memItemRight" valign="bottom"><b>void</b> (1 *CPLErrorHandler)(CPLErr</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af76a033b0968125edd76b8493288e98b"></a><!-- doxytag: member="cpl_error.h::CPLDefaultErrorHandler" ref="af76a033b0968125edd76b8493288e98b" args="(CPLErr, int, const char *)" --> void </td><td class="memItemRight" valign="bottom"><b>CPLDefaultErrorHandler</b> (CPLErr, int, const char *)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2a337a177e6f89059d56bad1f49db1b9"></a><!-- doxytag: member="cpl_error.h::CPLQuietErrorHandler" ref="a2a337a177e6f89059d56bad1f49db1b9" args="(CPLErr, int, const char *)" --> void </td><td class="memItemRight" valign="bottom"><b>CPLQuietErrorHandler</b> (CPLErr, int, const char *)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">CPLErrorHandler </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a74d0e649d58180e621540bf73b58e4a2">CPLSetErrorHandler</a> (CPLErrorHandler)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#ad13c9c8f2037ddfd566c2a197f7b2537">CPLPushErrorHandler</a> (CPLErrorHandler)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#ac6c7c393c94b210e4be999f34fcb6680">CPLPopErrorHandler</a> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e3680557f95a0a1035257bf0c2d3748"></a><!-- doxytag: member="cpl_error.h::CPLDebug" ref="a7e3680557f95a0a1035257bf0c2d3748" args="(const char *, const char *,...) CPL_PRINT_FUNC_FORMAT(2" --> void </td><td class="memItemRight" valign="bottom"><b>CPLDebug</b> (const char *, const char *,...) CPL_PRINT_FUNC_FORMAT(2</td></tr> <tr><td class="memItemLeft" align="right" valign="top">void void </td><td class="memItemRight" valign="bottom"><a class="el" href="cpl__error_8h.html#a081a96d074d6595b6ba2102da22c9877">_CPLAssert</a> (const char *, const char *, int)</td></tr> <tr><td colspan="2"><h2>Variables</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab832c174e145540d491b0830fc05dbb1"></a><!-- doxytag: member="cpl_error.h::int" ref="ab832c174e145540d491b0830fc05dbb1" args="" --> typedef </td><td class="memItemRight" valign="bottom"><b>int</b></td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <p>CPL error handling services. </p> <hr/><h2>Define Documentation</h2> <a class="anchor" id="a6386ea331961c83a66801f245bd80da4"></a><!-- doxytag: member="cpl_error.h::VALIDATE_POINTER0" ref="a6386ea331961c83a66801f245bd80da4" args="(ptr, func)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define VALIDATE_POINTER0</td> <td>(</td> <td class="paramtype">ptr, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">func </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { <span class="keywordflow">if</span>( NULL == ptr ) \ { \ CPLErr <span class="keyword">const</span> ret = VALIDATE_POINTER_ERR; \ CPLError( ret, CPLE_ObjectNull, \ <span class="stringliteral">"Pointer \'%s\' is NULL in \'%s\'.\n"</span>, #ptr, (func)); \ <span class="keywordflow">return</span>; }} <span class="keywordflow">while</span>(0) </pre></div> </div> </div> <a class="anchor" id="ab66c9b684f5dc1576d9cd68c2a288246"></a><!-- doxytag: member="cpl_error.h::VALIDATE_POINTER1" ref="ab66c9b684f5dc1576d9cd68c2a288246" args="(ptr, func, rc)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define VALIDATE_POINTER1</td> <td>(</td> <td class="paramtype">ptr, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">func, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">rc </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { <span class="keywordflow">if</span>( NULL == ptr ) \ { \ CPLErr <span class="keyword">const</span> ret = VALIDATE_POINTER_ERR; \ CPLError( ret, CPLE_ObjectNull, \ <span class="stringliteral">"Pointer \'%s\' is NULL in \'%s\'.\n"</span>, #ptr, (func)); \ <span class="keywordflow">return</span> (rc); }} <span class="keywordflow">while</span>(0) </pre></div> </div> </div> <hr/><h2>Function Documentation</h2> <a class="anchor" id="a081a96d074d6595b6ba2102da22c9877"></a><!-- doxytag: member="cpl_error.h::_CPLAssert" ref="a081a96d074d6595b6ba2102da22c9877" args="(const char *, const char *, int)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void void _CPLAssert </td> <td>(</td> <td class="paramtype">const char * </td> <td class="paramname"> <em>pszExpression</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>pszFile</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"> <em>iLine</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td></td> </tr> </table> </div> <div class="memdoc"> <p>Report failure of a logical assertion.</p> <p>Applications would normally use the CPLAssert() macro which expands into code calling <a class="el" href="cpl__error_8h.html#a081a96d074d6595b6ba2102da22c9877">_CPLAssert()</a> only if the condition fails. <a class="el" href="cpl__error_8h.html#a081a96d074d6595b6ba2102da22c9877">_CPLAssert()</a> will generate a CE_Fatal error call to CPLError(), indicating the file name, and line number of the failed assertion, as well as containing the assertion itself.</p> <p>There is no reason for application code to call <a class="el" href="cpl__error_8h.html#a081a96d074d6595b6ba2102da22c9877">_CPLAssert()</a> directly. </p> </div> </div> <a class="anchor" id="a29626fd8fdb658b19439beeb73a59560"></a><!-- doxytag: member="cpl_error.h::CPLErrorReset" ref="a29626fd8fdb658b19439beeb73a59560" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void CPLErrorReset </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Erase any traces of previous errors.</p> <p>This is normally used to ensure that an error which has been recovered from does not appear to be still in play with high level functions. </p> </div> </div> <a class="anchor" id="a7f71ade3bb0a0e9e45802975ec59ff5e"></a><!-- doxytag: member="cpl_error.h::CPLGetLastErrorMsg" ref="a7f71ade3bb0a0e9e45802975ec59ff5e" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">const char* CPLGetLastErrorMsg </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Get the last error message.</p> <p>Fetches the last error message posted with CPLError(), that hasn't been cleared by <a class="el" href="cpl__error_8h.html#a29626fd8fdb658b19439beeb73a59560">CPLErrorReset()</a>. The returned pointer is to an internal string that should not be altered or freed.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>the last error message, or NULL if there is no posted error message. </dd></dl> </div> </div> <a class="anchor" id="a198afe56aced1d73226880aa90d39b99"></a><!-- doxytag: member="cpl_error.h::CPLGetLastErrorNo" ref="a198afe56aced1d73226880aa90d39b99" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int CPLGetLastErrorNo </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Fetch the last error number.</p> <p>This is the error number, not the error class.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>the error number of the last error to occur, or CPLE_None (0) if there are no posted errors. </dd></dl> </div> </div> <a class="anchor" id="a8df0d4e01034cf79202314c92251e920"></a><!-- doxytag: member="cpl_error.h::CPLGetLastErrorType" ref="a8df0d4e01034cf79202314c92251e920" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">CPLErr CPLGetLastErrorType </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Fetch the last error type.</p> <p>This is the error class, not the error number.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>the error number of the last error to occur, or CE_None (0) if there are no posted errors. </dd></dl> </div> </div> <a class="anchor" id="ac6c7c393c94b210e4be999f34fcb6680"></a><!-- doxytag: member="cpl_error.h::CPLPopErrorHandler" ref="ac6c7c393c94b210e4be999f34fcb6680" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void CPLPopErrorHandler </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Pop error handler off stack.</p> <p>Discards the current error handler on the error handler stack, and restores the one in use before the last <a class="el" href="cpl__error_8h.html#ad13c9c8f2037ddfd566c2a197f7b2537">CPLPushErrorHandler()</a> call. This method has no effect if there are no error handlers on the current threads error handler stack. </p> </div> </div> <a class="anchor" id="ad13c9c8f2037ddfd566c2a197f7b2537"></a><!-- doxytag: member="cpl_error.h::CPLPushErrorHandler" ref="ad13c9c8f2037ddfd566c2a197f7b2537" args="(CPLErrorHandler)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void CPLPushErrorHandler </td> <td>(</td> <td class="paramtype">CPLErrorHandler </td> <td class="paramname"> <em>pfnErrorHandlerNew</em></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Push a new CPLError handler.</p> <p>This pushes a new error handler on the thread-local error handler stack. This handler will be used untill removed with <a class="el" href="cpl__error_8h.html#ac6c7c393c94b210e4be999f34fcb6680">CPLPopErrorHandler()</a>.</p> <p>The <a class="el" href="cpl__error_8h.html#a74d0e649d58180e621540bf73b58e4a2">CPLSetErrorHandler()</a> docs have further information on how CPLError handlers work.</p> <dl><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>pfnErrorHandlerNew</em> </td><td>new error handler function. </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="a74d0e649d58180e621540bf73b58e4a2"></a><!-- doxytag: member="cpl_error.h::CPLSetErrorHandler" ref="a74d0e649d58180e621540bf73b58e4a2" args="(CPLErrorHandler)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">CPLErrorHandler CPLSetErrorHandler </td> <td>(</td> <td class="paramtype">CPLErrorHandler </td> <td class="paramname"> <em>pfnErrorHandlerNew</em></td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p>Install custom error handler.</p> <p>Allow the library's user to specify his own error handler function. A valid error handler is a C function with the following prototype:</p> <pre> void MyErrorHandler(CPLErr eErrClass, int err_no, const char *msg) </pre><p>Pass NULL to come back to the default behavior. The default behaviour (CPLDefaultErrorHandler()) is to write the message to stderr.</p> <p>The msg will be a partially formatted error message not containing the "ERROR %d:" portion emitted by the default handler. Message formatting is handled by CPLError() before calling the handler. If the error handler function is passed a CE_Fatal class error and returns, then CPLError() will call abort(). Applications wanting to interrupt this fatal behaviour will have to use longjmp(), or a C++ exception to indirectly exit the function.</p> <p>Another standard error handler is CPLQuietErrorHandler() which doesn't make any attempt to report the passed error or warning messages but will process debug messages via CPLDefaultErrorHandler.</p> <p>Note that error handlers set with <a class="el" href="cpl__error_8h.html#a74d0e649d58180e621540bf73b58e4a2">CPLSetErrorHandler()</a> apply to all threads in an application, while error handlers set with CPLPushErrorHandler are thread-local. However, any error handlers pushed with CPLPushErrorHandler (and not removed with CPLPopErrorHandler) take precidence over the global error handlers set with <a class="el" href="cpl__error_8h.html#a74d0e649d58180e621540bf73b58e4a2">CPLSetErrorHandler()</a>. Generally speaking <a class="el" href="cpl__error_8h.html#a74d0e649d58180e621540bf73b58e4a2">CPLSetErrorHandler()</a> would be used to set a desired global error handler, while <a class="el" href="cpl__error_8h.html#ad13c9c8f2037ddfd566c2a197f7b2537">CPLPushErrorHandler()</a> would be used to install a temporary local error handler, such as CPLQuietErrorHandler() to suppress error reporting in a limited segment of code.</p> <dl><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>pfnErrorHandlerNew</em> </td><td>new error handler function. </td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>returns the previously installed error handler. </dd></dl> </div> </div> </div> <hr> Generated for GDAL by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.6.2-20100208. </body> </html>