root/trunk/examples/patErrorHandlerDebug.php

Revision 45 (checked in by schst, 4 months ago)

Got rid of E_STRICT messages, adjusted code to PEAR standards

  • Property 0 set to
  • Property 1 set to
Line 
1 <?php
2 /**
3  * custom patErrorManager handler for the callback error handling mode
4  *
5  * Provides the pat-teams favourite error handlers.
6  *
7  * $Id$
8  *
9  * @access        public
10  * @package        patError
11  * @subpackage    Debug
12  */
13  
14  $GLOBALS['_pat_errorsCounter'] = 0;
15  $GLOBALS['_pat_errorStylesPrinted'] = false;
16
17 /**
18  * custom patErrorManager handler for the callback error handling mode
19  *
20  * @package        patErrorManager
21  * @subpackage    Debug
22  * @author        gERD Schaufelberger <gerd@php-tools.net>
23  * @author        Stephan Schmidt <schst@php-tools.net>
24  * @author         Sebastian 'The Argh' Mordziol <argh@php-tools.net>
25  * @version        0.1
26  * @license        LGPL
27  * @link        http://www.php-tools.net
28  */
29 class patErrorHandlerDebug {
30     /**
31     * niceDie - outputs a nicely formatted version of the traditional die()
32     *
33     * @static
34     * @access    public
35     * @param    string    $error    The error message to display
36     */
37     public function niceDie($error) {
38         echo    '<html>
39                     <body bgcolor="#ffffff" text="#000000">
40                     <div style="padding:20px;">
41                         <div style="font-family:tahoma;font-size:12px;font-weight:bold;margin-bottom:10px;">critical Error encountered [patDebugErrorHandler]</div>
42                         <table cellpadding="0" cellspacing="0" border="0">
43                             <tr valign="top">
44                                 <td>Error details</td>
45                                 <td>&nbsp;:&nbsp;</td>
46                                 <td>
47                                     <pre>';
48                                         print_r( $error );
49         echo    '                    </pre>
50                                 </td>
51                             </tr>
52                         </table>
53                     </div>
54                     </body>
55                     </html>';
56                     
57         exit();
58     }
59
60    /**
61     * error handler that outputs nice debugging HTML
62     *
63     * Displays:
64     * - Error level
65     * - Error Message
66     * - Error info
67     * - Error file
68     * - Error line
69     * - plus the call stack that lead to the error
70     *
71     * The output has been inspired by Derick Rethan's xDebug.
72     *
73     * @author    Stephan Schmidt <schst@php-tools.net>
74     * @access    public
75     * @static
76     * @param    object        error object
77     * @return    object        error object
78     * @todo        console output (no HTML)
79     */
80     public function schstDebug($error) {
81         echo    '<div style="backgound-color:#ffffff;">';
82         printf(
83                 '<strong>%s:</strong> %s (Userinfo: %s) in %s on line %s<br />',
84                 patErrorManager::translateErrorLevel( $error->getLevel() ),
85                 $error->getMessage(),
86                 $error->getInfo(),
87                 $error->getFile(),
88                 $error->getLine()
89             );
90
91         $backtrace    =    $error->getBacktrace();
92         if (is_array($backtrace)) {
93             $j    =    1;
94             echo    '<table border="1" cellpadding="2" cellspacing="1" style="border-width:1px; border-style:solid; border-color:#000000;">';
95             echo    '    <tr>';
96             echo    '        <td colspan="3" align="center"><strong>Call stack</strong></td>';
97             echo    '    </tr>';
98             echo    '    <tr>';
99             echo    '        <td><strong>#</strong></td>';
100             echo    '        <td><strong>Function</strong></td>';
101             echo    '        <td><strong>Location</strong></td>';
102             echo    '    </tr>';
103             for( $i = count( $backtrace )-1; $i >= 0 ; $i-- )
104             {
105                 echo    '    <tr>';
106                 echo    "        <td>{$j}</td>";
107                 if( isset( $backtrace[$i]['class'] ) )
108                 {
109                     echo    "    <td>{$backtrace[$i]['class']}{$backtrace[$i]['type']}{$backtrace[$i]['function']}()</td>";
110                 }
111                 else
112                 {
113                     echo    "    <td>{$backtrace[$i]['function']}()</td>";
114                 }
115                 if( isset( $backtrace[$i]['file'] ) )
116                 {
117                     echo    "        <td>{$backtrace[$i]['file']}:{$backtrace[$i]['line']}</td>";
118                 }
119                 else
120                 {
121                     echo    "        <td>&nbsp;</td>";
122                 }
123                 echo    '    </tr>';
124                 $j++;
125             }
126             echo    '</table>';
127         }
128         echo    '</div>';
129         
130         $level    =    $error->getLevel();
131         
132         if( $level != E_ERROR )
133             return    $error;
134             
135         exit();
136     }
137
138    /**
139     * Error handler that outputs pretty debugging HTML
140     *
141     * Displays:
142     * - Error level
143     * - Error Message
144     * - Error info
145     * - Error file
146     * - Error line
147     * - plus the call stack that lead to the error
148     *
149     * The output has been inspired by Schst's debug, updated for a
150     * designer's eye.
151     *
152     * @author    Sebastian Mordziol <argh@php-tools.net>
153     * @access    public
154     * @static
155     * @param    object        error object
156     * @return    object        error object
157     */
158     public function arghDebug($error) {
159         $GLOBALS['_pat_errorsCounter'] = $GLOBALS['_pat_errorsCounter'] + 1;
160         $prefix = 'arghDebug';
161         $errorColors = array(
162             E_NOTICE => 'F6F6F6',
163             E_WARNING => 'FEFCF3',
164             E_ERROR => 'FFE3CA',
165         );
166         
167         // display the styles definition, but only once
168         if( !$GLOBALS['_pat_errorStylesPrinted'] ) {
169             echo '<style>';
170             echo '.'.$prefix.'Frame{';
171             echo '    background-color:#'.$errorColors[E_ERROR].';';
172             echo '    padding:8px;';
173             echo '    border:solid 1px #000000;';
174             echo '    margin-top:13px;';
175             echo '    margin-bottom:25px;';
176             echo '    width:100%;';
177             echo '}';
178             echo '.'.$prefix.'Frame'.E_NOTICE.'{';
179             echo '    background-color:#'.$errorColors[E_NOTICE].';';
180             echo '}';
181             echo '.'.$prefix.'Frame'.E_WARNING.'{';
182             echo '    background-color:#'.$errorColors[E_WARNING].';';
183             echo '}';
184             echo '.'.$prefix.'Frame'.E_ERROR.'{';
185             echo '    background-color:#'.$errorColors[E_ERROR].';';
186             echo '}';
187             echo '.'.$prefix.'Table{';
188             echo '    border-collapse:collapse;';
189             echo '    margin-top:13px;';
190             echo '    width:100%;';
191             echo '  display:none;';
192             echo '}';
193             echo '.'.$prefix.'TD{';
194             echo '    padding:3px;';
195             echo '    padding-left:5px;';
196             echo '    padding-right:5px;';
197             echo '    border:solid 1px #999999;';
198             echo '}';
199             echo '.'.$prefix.'Type{';
200             echo '    background-color:#cc0000;';
201             echo '    color:#ffffff;';
202             echo '    font-weight:bold;';
203             echo '    padding:3px;';
204             echo '}';
205             echo '.'.$prefix.'BakLink{';
206             echo '  cursor:pointer;';
207             echo '  text-decoration:underline;';
208             echo '  color:#990000;';
209             echo '  margin-top:6px;';
210             echo '}';
211             echo '.'.$prefix.'Text{';
212             echo '  font:normal 10pt Verdana,Arial,Tahoma,Helvetica,sans-serif,monospace;';
213             echo '}';
214             echo '</style>';
215             echo '<script language="javascript" type="text/javascript">';
216             echo 'function '.$prefix.'DisplayBacktrace( errorID ) {';
217             echo '  var btnEl = document.getElementById( \''.$prefix.'Backtrace\' + errorID + \'Link\' );';
218             echo '  var bakEl = document.getElementById( \''.$prefix.'Backtrace\' + errorID );';
219             echo '  btnEl.style.display = \'none\';';
220             echo '  bakEl.style.display = \'block\';';
221             echo '}';
222             echo '</script>';
223             
224             $GLOBALS['_pat_errorStylesPrinted'] = true;
225         }
226     
227         echo    '<div class="'.$prefix.'Frame '.$prefix.'Frame'.$error->getLevel().'">';
228         printf(
229                 '<div style="margin-bottom:8px;" class="'.$prefix.'Text"><span class="'.$prefix.'Type">%s:</span> %s in %s on line %s</div>',
230                 patErrorManager::translateErrorLevel( $error->getLevel() ),
231                 $error->getMessage(),
232                 $error->getFile(),
233                 $error->getLine()
234             );
235
236         echo '<div class="'.$prefix.'Text">Details: ';
237         $details = $error->getInfo();
238         if( !empty( $details ) ) {
239             echo $details;
240         } else {
241             echo '<i>no additional info available</i>';
242         }
243         echo '</div>';
244         echo '<div id="'.$prefix.'Backtrace'.$GLOBALS['_pat_errorsCounter'].'Link" onclick="'.$prefix.'DisplayBacktrace( \''.$GLOBALS['_pat_errorsCounter'].'\' );" class="'.$prefix.'BakLink '.$prefix.'Text">Display full backtrace &raquo;</div>';
245
246
247         $backtrace    =    $error->getBacktrace();
248         if( is_array( $backtrace ) )
249         {
250             $j    =    1;
251             echo    '<table border="0" cellpadding="0" cellspacing="0" class="'.$prefix.'Table '.$prefix.'Text" id="'.$prefix.'Backtrace'.$GLOBALS['_pat_errorsCounter'].'">';
252             echo    '    <tr>';
253             echo    '        <td class="'.$prefix.'TD"><strong>#</strong></td>';
254             echo    '        <td class="'.$prefix.'TD"><strong>Function</strong></td>';
255             echo    '        <td class="'.$prefix.'TD"><strong>Location</strong></td>';
256             echo    '    </tr>';
257             for( $i = count( $backtrace )-1; $i >= 0 ; $i-- )
258             {
259                 echo    '    <tr>';
260                 echo    '        <td class="'.$prefix.'TD">'.$j.'</td>';
261                 if( isset( $backtrace[$i]['class'] ) )
262                 {
263                     echo    '    <td class="'.$prefix.'TD">'.$backtrace[$i]['class'].$backtrace[$i]['type'].$backtrace[$i]['function'].'()</td>';
264                 }
265                 else
266                 {
267                     echo    '    <td class="'.$prefix.'TD">'.$backtrace[$i]['function'].'()</td>';
268                 }
269                 if( isset( $backtrace[$i]['file'] ) )
270                 {
271                     echo    '        <td class="'.$prefix.'TD">'.$backtrace[$i]['file'].':'.$backtrace[$i]['line'].'</td>';
272                 }
273                 else
274                 {
275                     echo    '        <td class="'.$prefix.'TD">&nbsp;</td>';
276                 }
277                 echo    '    </tr>';
278                 $j++;
279             }
280             echo    '</table>';
281         }
282         echo    '</div>';
283         
284         $level    =    $error->getLevel();
285         
286         if( $level != E_ERROR )
287             return    $error;
288             
289         exit();
290     }
291 }
292 ?>
Note: See TracBrowser for help on using the browser.