CSCI 215 Web Programming II Debugging & Error Handling Error Types Parse (syntax) errors ◦ Occur when the scripting engine fails to recognize code ◦ Example: Incorrectly spelled or mistyped words Run-time errors ◦ Occur when the engine encounters a problem while program is running ◦ Example: Division by zero Logic errors ◦ Flaws in program design that prevent the program from running as intended ◦ Example: Infinite loop 2 Parse Error 11 12 13 14 15 16 17 18 <?php for ($count = 10; $count >= 0; --$count) if ($count == 0) echo "<p>We have liftoff!</p>"; else echo "<p>Liftoff in $count seconds.</p>"; } ?> PHP Programming 3 Parse Error PHP Programming 4 Run-Time Errors E_NOTICE Indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script. E_USER_NOTICE User-generated notice message, generated by trigger_error(). E_WARNING Run-time warnings (non-fatal errors). Execution of the script is not halted. E_USER_WARNING User-generated warning message, generated by trigger_error(). E_COMPILE_WARNING Fatal compile-time errors. E_CORE_WARNING Warnings that occur during PHP's initial startup. E_ERROR Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted. E_USER_ERROR User-generated error message, generated by trigger_error(). E_COMPILE_ERROR Fatal compile-time errors. E_CORE_ERROR Fatal errors that occur during PHP's initial startup. E_PARSE Compile-time parse (syntax) errors. notices warnings fatal errors Notices Raised for potential run-time errors that do not prevent a script from executing Examples ◦ use of an undefined variable ◦ defining a string without quotes PHP Programming 6 Notices <?php error_reporting(E_ALL); echo '<p>Error 1: Undefined variable:</p>'; echo $undefined_var; echo '<p>Error 2: Unquoted string:</p>'; $some_var = tryetrhrtdf; ?> http://ned.highline.edu/~tostrander/215/error_handling/error1.php Notices Warnings Do not prevent a script from executing Indicate that something clearly wrong has happened and action should be taken. Examples: ◦ File not found ◦ Database not available ◦ Missing function arguments PHP Programming 9 Warnings function beginCountdown($time) { if (!isset($time)) $time = 10; for ($count = $time; $count >= 0; —$count) { if ($count == 0) echo '<p>We have liftoff!</p>'; else echo "<p>Liftoff in $count seconds.</p>"; } } beginCountdown(); PHP Programming 10 Warnings PHP Programming 11 Warnings <? echo '<p>Error 1: file not available:</p>'; $fp = fopen('file_does_not_exist.dat','r'); echo '<p>Error 2: db not available:</p>'; $results = mysql_query('SOME QUERY'); ?> http://ned.highline.edu/~tostrander/215/error_handling/error2.php Warnings Fatal Errors Raised when a run-time error prevents a script from executing Something so terrible has happened during execution of your script that processing cannot continue. Examples: ◦ Parse error ◦ Calling an undefined function PHP Programming 14 Fatal Errors <? error_reporting(E_ALL); echo '<p>Error 1: Undefined function:</p>'; $fp = non_existing_function('an_arg'); echo 'Code never gets here!!!'; ?> http://ned.highline.edu/~tostrander/215/error_handling/error3.php Raising Errors It is possible to force a PHP error at any point in your script. trigger_error($msg, $type); Example: if (!$name) { trigger_error('No name entered', E_USER_ERROR); } … trigger_error() trigger_error() accepts two arguments: ◦ A custom error message ◦ The error reporting level E_USER_ERROR E_USER_WARNING E_USER_NOTICE PHP Programming 17 if (isset($_GET['height']) && isset($_GET['weight'])) { if (!is_numeric($_GET['weight']) || !is_numeric($_GET['height'])) { trigger_error(“User did not enter numeric values”, E_USER_ERROR); } } else { trigger_error(“Values not entered”, E_USER_ERROR); } $bodyMass = $_GET['weight'] / ($_GET['height'] * $_GET['height']) * 703; print "Your body mass index is $bodyMass"; PHP Programming 18 PHP Programming 19 php.ini Directives display_errors ◦ prints script error messages ◦ default value of “On” error_reporting ◦ determines which types of error messages PHP should generate ◦ by default, assigned a value of “E_ALL” PHP Programming 20 Set Error Reporting Level error_reporting($level) Used to control which errors are displayed, and which are ignored. Only lasts for the duration of your script ini_set('display_errors', 1); // turn all error reporting ON // error_reporting(E_ALL); // Report all errors except E_NOTICE // error_reporting(E_ALL ^ E_NOTICE); // Turn off all error reporting error_reporting(0); // generate errors echo '<p>Error 1: Use of an undefined variable.</p>'; echo $undefined_var; echo '<p>Error 2: Use of an unquoted string.</p>'; $some_var = tryetrhrtdf; echo '<p>Error 3: file not available:</p>'; $fp = fopen('this_file_does_not_exist.dat','r'); echo '<p>Error 4: db not available:</p>'; $results = mysql_query('SOME QUERY'); echo '<p>Error 5: call to undefined function:</p>'; $fp = non_existing_function('an_arg'); echo 'Code never gets here!!!'; http://ned.highline.edu/~tostrander/215/error_handling/error4.php Hiding Errors Hiding errors is NOT a solution to a problem. It is useful, however, to hide any errors produced on a live server. While developing and debugging code, displaying all errors is highly recommended! Suppressing Errors The special @ operator can be used to suppress function errors Any error produced by the function is suppressed regardless of the error reporting setting. $db = @mysql_connect($h,$u,$p); if (!$db) { trigger_error(‘blah’, E_USER_ERROR); } Suppressing Errors Error suppression is NOT a solution to a problem. It can be useful to locally define your own error handling mechanisms. If you suppress errors, you must check for them yourself elsewhere. Custom Error Handling You can write your own function to handle PHP errors however you want. The handler function should receive four arguments The handler function should return true to indicate it has handled the error Register the function in your script as the error handler Custom Error Handling function err_handler( $errcode, $errmsg, $file, $lineno) { echo ‘An error has occurred!<br />’; echo “file: $file<br />”; echo “line: $lineno<br />”; echo “Problem: $errmsg”; return true; } The handler must have 4 inputs.. 1. error code 2. error message 3. file where error occurred 4. line at which error occurred Custom Error Handling The function then needs to be registered as your custom error handler: set_error_handler(‘err_handler’); You can ‘mask’ the custom error handler so it only receives certain types of errors ◦ Example: register a custom handler just for user triggered errors set_error_handler(‘err_handler’, E_USER_NOTICE | E_USER_WARNING | E_USER_ERROR); Custom Error Handler A custom error handler is never passed E_PARSE, E_CORE_ERROR or E_COMPILE_ERROR errors These are considered too dangerous function err_handler($errcode,$errmsg,$file,$lineno) { echo 'An error has occurred!<br />'; echo "file: $file<br />"; echo "line: $lineno<br />"; echo "Problem: $errmsg<br />"; return true; } set_error_handler('err_handler'); // register handler echo '<p>Error 1: Use of an undefined variable.</p>'; echo $undefined_var; echo '<p>Error 2: Use of an unquoted string.</p>'; $some_var = tryetrhrtdf; echo '<p>Error 3: file not available:</p>'; $fp = fopen('this_file_does_not_exist.dat','r'); echo '<p>Error 4: db not available:</p>'; $results = mysql_query('SOME QUERY'); echo '<p>Error 5: call to undefined function:</p>'; $fp = non_existing_function('an_arg'); echo 'Code never gets here!!!'; http://ned.highline.edu/~tostrander /215/error_handling/error5.php Other Tips Trace errors Follow coding standards Write stub functions “Comment out” problematic lines Analyze logic carefully PHP Programming 33 Trace Errors Tracing is the examination of individual statements in an executing program echo one of the most useful ways to trace PHP code Use echo to display the contents of a variable, an array, or the value returned from a function PHP Programming 34 function calculatePay() { $PayRate = 15; $NumHours = 40; $GrossPay = $PayRate * $NumHours; echo “Gross Pay: $GrossPay<br />”; $FederalTaxes = $GrossPay * .06794; $StateTaxes = $GrossPay * .0476; $SocialSecurity = $GrossPay * .062; $Medicare = $GrossPay * .0145; $NetPay = $GrossPay - $FederalTaxes; echo “Net Pay 1: $NetPay<br />”; $NetPay *= $StateTaxes; echo “Net Pay 2: $NetPay<br />”; $NetPay *= $SocialSecurity; echo “Net Pay 3: $NetPay<br />”; $NetPay *= $Medicare; echo “Net Pay 4: $NetPay<br />”; return number_format($NetPay, 2); } PHP Programming 35 Stub Functions function calcTax($amount) { "Stubs" are empty functions return 1; that serve as placeholders for } a program’s actual functions function isValid($email) { return true; } Stubs return a hard-coded value Use Comments to Debug $Amount = 100000; $Percentage = .08; printf(“The interest rate or a loan in the amount of $%.2f is %s%%.<br />”, $Amount, $Percentage * 100); $YearlyInterest = $Amount * $Percentage; // printf(“The amount of interest for one year is // $%.2f.<br />”, $YearlyInterest); // $MonthlyInterest = $YearlyInterest / 12; // printf(“The amount of interest for one month is // $%.2f.<br />”, $MonthlyInterest); // $DailyInterest = $YearlyInterest / 365; // printf(“The amount of interest for one day is $%.2f. // <br />”, $DailyInterest); The cause of an error in a statement is often the result of an error in a preceding statement PHP Programming 37 Analyze Logic Logic errors are the hardest to debug You must analyze each statement carefully if (!isset($_GET['firstName'])) echo “You must enter your first name!”; exit(); echo “Welcome to my Web site, ” . $_GET['firstName']; PHP Programming 38 Analyze Logic $n = 1; while($n < 10){ echo $n; } Isolate problematic code for ($count = 1; $count < 6; $count++); echo “$count<br />”; PHP Programming 39 Learn More http://www.w3schools.com/php/php_error.asp