<?xml version="1.0" encoding="iso-8859-1"?> <!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/html; charset=iso-8859-1" /> <title> Controlling error generation </title> <link rel="stylesheet" href="book.css" type="text/css" /> <meta name="generator" content="DocBook XSL Stylesheets V1.69.1" /> <link rel="start" href="index.html" title="HTML_Progress2 Manual" /> <link rel="up" href="ch16.html" title= "Chapter 16. Error Handler" /> <link rel="prev" href="ch16s02.html" title="Configuring a Handler " /> <link rel="next" href="ch16s04.html" title="Error Context Display " /> <style type="text/css"> /*<![CDATA[*/ body { background-color: white; color: black; } :link { color: #0000FF } :visited { color: #840084 } :active { color: #0000FF } div.c3 {margin-left: 0.5in; margin-right: 0.5in;} div.c2 {font-family: monospace;} h2.c1 {clear: both} /*]]>*/ </style> </head> <body> <table class="progress2Header"> <tr> <td> <img src="img/pear_progress2.gif" align="left" alt= "PEAR Progress2 logo" /> <h1> HTML_Progress2 : The Definitive Guide </h1> <div class="navheader"> <table width="100%" summary="Navigation header"> <tr> <th colspan="3" align="center"> Controlling error generation </th> </tr> <tr> <td width="20%" align="left"> <a accesskey="p" href="ch16s02.html">Prev</a> </td> <th width="60%" align="center"> Chapter 16. Error Handler </th> <td width="20%" align="right"> <a accesskey="n" href="ch16s04.html">Next</a> </td> </tr> </table> </div> </td> </tr> </table> <div class="sect1" lang="en" xml:lang="en"> <div class="titlepage"> <h2 class="title c1"> <a name="id4798496" id="id4798496"></a>Controlling error generation </h2> </div> <p> There are many scenarios in which fine-grained control over error raising is absolutely necessary. </p> <p> The first level to control error generation is the <code class= "filename">php.ini</code> directives <span class= "emphasis"><em>display_errors</em></span> and <span class= "emphasis"><em>log_errors</em></span>. When these directives are set to <code class="constant">TRUE</code>, then browser and file outputs are effective. </p> <div class="tip c3"> <table border="0" summary="Tip"> <tr> <td rowspan="2" align="center" valign="top" width="48"> <img alt="[Tip]" src="img/admons/tip.png" /> </td> <th align="left"> Tip </th> </tr> <tr> <td align="left" valign="top"> If you want to ignore all errors raised (no display, no logs) and avoid to include PEAR core class, then you should have something like : <div class="php c2"> <ol> <li class="li1"> <div class="de1"> <span class="kw2"><?php</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">require_once</span> <span class= "st0">'HTML/Progress2.php'</span><span class= "sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">function</span> myErrorHandler<span class="br0">(</span><span class= "br0">)</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">{</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">}</span> </div> </li> <li class="li1"> <div class="de1"> </div> </li> <li class="li1"> <div class="de1"> <span class="re1">$errorConf</span> <span class= "sy0">=</span> <span class="kw3">array</span><span class= "br0">(</span><span class="st0">'error_handler'</span> <span class="sy0">=></span> <span class= "st0">'myErrorHandler'</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="re1">$meter</span> <span class= "sy0">=</span> <span class="kw2">new</span> HTML_Progress2<span class="br0">(</span><span class= "re1">$errorConf</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="co1">// ...</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">?></span> </div> </li> </ol> </div> </td> </tr> </table> </div> <div class="caution c3"> <table border="0" summary="Caution"> <tr> <td rowspan="2" align="center" valign="top" width="48"> <img alt="[Caution]" src="img/admons/caution.png" /> </td> <th align="left"> Caution </th> </tr> <tr> <td align="left" valign="top"> The previous example will ignore display and logging activity, but NEVER ignore internal stack error. In other words, you'll keep always minimum information in the progress stack error. These informations are : <div class="php c2"> <ol> <li class="li1"> <div class="de1"> <span class="kw2"><?php</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw3">array</span><span class= "br0">(</span><span class="st0">'code'</span> <span class="sy0">=></span> <span class= "re1">$code</span><span class="sy0">,</span> <span class= "st0">'level'</span> <span class="sy0">=></span> <span class="re1">$level</span><span class="sy0">,</span> <span class="st0">'params'</span> <span class= "sy0">=></span> <span class= "re1">$params</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="coMULTI">/*</span> </div> </li> <li class="li1"> <div class="de1"> <span class="coMULTI"> $code : API error code (HTML_PROGRESS2_ERROR_* constant value)</span> </div> </li> <li class="li1"> <div class="de1"> <span class="coMULTI"> $level : API error level (warning, error, exception)</span> </div> </li> <li class="li1"> <div class="de1"> <span class="coMULTI"> $params: API context execution parameters hash (function argument: name, type, value)</span> </div> </li> <li class="li1"> <div class="de1"> <span class="coMULTI"> */</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">?></span> </div> </li> </ol> </div>So, these lines are always true (in error condition): <div class="php c2"> <ol> <li class="li1"> <div class="de1"> <span class="kw2"><?php</span> </div> </li> <li class="li1"> <div class="de1"> <span class="re1">$meter</span> <span class= "sy0">=</span> <span class="kw2">new</span> HTML_Progress2<span class="br0">(</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="co1">// ...</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">if</span> <span class= "br0">(</span><span class="re1">$meter</span><span class= "sy0">-></span><span class= "me1">hasErrors</span><span class= "br0">(</span><span class="br0">)</span> <span class= "sy0">></span> <span class="nu0">0</span><span class= "br0">)</span> <span class="br0">{</span> </div> </li> <li class="li1"> <div class="de1"> <span class="co1">// do something on error ...</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">}</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">?></span> </div> </li> </ol> </div> </td> </tr> </table> </div> <p> It's up to you to choose your programming way. Just keep in mind this warning, in case of code evolution (error handler configuration). Behavior could change, and you won't keep backward compatibility. </p> <p> With <span class="bold"><strong>push_callback</strong></span> option, you can decides to stop script execution (as done with exceptions by default: returns <code class="constant">PEAR_ERROR_DIE</code> constant), or continue without filtering (returns <code class= "constant">NULL</code>). </p> <p> If you want to write your own callback function for the <span class= "emphasis"><em>push_callback</em></span> option, this one should have two arguments: first one will get the error code, and second will get error level. These are all the necessary informations to do a filtering. Example that follow show how to be aware that a deprecated function is used in a script. </p> <div class="php c2"> <ol> <li class="li1"> <div class="de1"> <span class="kw2"><?php</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">require_once</span> <span class= "st0">'HTML/Progress2.php'</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">function</span> myErrorFilter<span class= "br0">(</span><span class="re1">$code</span><span class= "sy0">,</span> <span class="re1">$level</span><span class= "br0">)</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">{</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">if</span> <span class= "br0">(</span><span class="re1">$code</span> <span class= "sy0">===</span> HTML_PROGRESS2_ERROR_DEPRECATED<span class= "br0">)</span> <span class="br0">{</span> </div> </li> <li class="li1"> <div class="de1"> <span class= "kw3">error_log</span><span class="br0">(</span><span class= "st0">'script: '</span><span class="sy0">.</span><span class= "kw2">__FILE__</span><span class="sy0">.</span><span class= "st0">' still used a deprecated function'</span><span class= "sy0">,</span> <span class="nu0">1</span><span class= "sy0">,</span> <span class= "st0">'admin@yoursite.com'</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">}</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw1">return</span> <span class= "kw2">null</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="br0">}</span> </div> </li> <li class="li1"> <div class="de1"> </div> </li> <li class="li1"> <div class="de1"> <span class="re1">$errorConf</span> <span class="sy0">=</span> <span class="kw3">array</span><span class= "br0">(</span><span class="st0">'push_callback'</span> <span class="sy0">=></span> <span class= "st0">'myErrorFilter'</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="re1">$meter</span> <span class="sy0">=</span> <span class="kw2">new</span> HTML_Progress2<span class= "br0">(</span><span class="re1">$errorConf</span><span class= "br0">)</span><span class="sy0">;</span> </div> </li> <li class="li1"> <div class="de1"> <span class="co1">// ...</span> </div> </li> <li class="li1"> <div class="de1"> <span class="kw2">?></span> </div> </li> </ol> </div> </div> <table class="progress2Footer"> <tr> <td align="left"> HTML_Progress2 : The Definitive Guide </td> <td align="right"> v 2.4.0 : April 20, 2007 </td> </tr> </table> <div class="navfooter"> <hr /> <table width="100%" summary="Navigation footer"> <tr> <td width="40%" align="left"> <a accesskey="p" href="ch16s02.html">Prev</a> </td> <td width="20%" align="center"> <a accesskey="u" href="ch16.html">Up</a> </td> <td width="40%" align="right"> <a accesskey="n" href="ch16s04.html">Next</a> </td> </tr> <tr> <td width="40%" align="left" valign="top"> Configuring a Handler </td> <td width="20%" align="center"> <a accesskey="h" href="index.html">Home</a> </td> <td width="40%" align="right" valign="top"> Error Context Display </td> </tr> </table> </div> </body> </html>