Date post: | 11-May-2015 |
Category: |
Real Estate |
Upload: | james-titcumb |
View: | 5,745 times |
Download: | 3 times |
Errors, Exceptions & Loggingby James Titcumb
at PHP Hampshire Oct ‘13
Errors
● Something broke… :)● e.g.
○ Can’t connect to MySQL (mysqli_connect)○ No such file or directory (fopen)
● Usually from PHP core● Sometimes fatal (stop execution)
What are errors?
Types of PHP Errors
● E_ERROR● E_WARNING● E_NOTICE● E_PARSE● Others (E_STRICT, E_DEPRECATED) etc.● User errors (E_USER_ERROR etc.)
E_ERROR
<?php
foo();
// Fatal error: Call to undefined function foo() in /in//in/N2gbL on line 3
E_WARNING
<?php
fopen('foo', 'r');
// Warning: fopen(foo): failed to open stream: No such file or directory in /in//in/tZHGY on line 3
E_NOTICE
<?php
$a = $b;
// Notice: Undefined variable: b in /in//in/9dPC5 on line 3
E_PARSE
<?php
x c
// Parse error: syntax error, unexpected 'c' (T_STRING) in /in//in/fkEaj on line 3
Problems?
source: http://www.dpaddbags.com/blog/episode-119-technology-sucks/
Problems.
● Depends on “error_reporting” php.ini setting● Displaying errors is UGLY● Existence of “@” operator● Only logs to file or syslog● Easily ignored● Not very “OO”
Ways Around// Will raise E_NOTICEfopen($somefile, 'r');
// No error! :)if (file_exists($somefile)) { fopen($somefile, 'r');} else { // nice handling...}
Exceptions
● Something still broke● Wider scope:
○ Logic errors○ Flow control (for errors)
● “Catchable”● Turn into fatal errors if not caught● They are classes (can make your own)● Common in other OO languages
What are exceptions?
Jargon Buster
● throwTriggering an exception
● tryTry to run a piece of code which *may* throw an exception
● catchHandle an exception
● finallyAlways run some code after a try/catch block
● Built in to PHP ● More descriptive than just “Exception”, e.g.:
○ InvalidArgumentException○ LogicException○ OutOfBoundsException○ RuntimeException○ see PHP manual for more
SPL Exceptions
Example (throw)
class Division
{ public function divide($a, $b)
{
if ($b == 0) {
throw new Exception(‘div by zero’);
}
return ($a / $b);
}
}
Example (catch)
$division = new Division();
try
{
$result = $division->divide(5, 0);
}
catch (Exception $exception)
{
$logger->warning($exception->getMessage());
}
Logging
Why use logging?
● Easier to find problems● More detail● “paper trail” for code● Log where you want
What about Apache’s error_log?
source: http://up-ship.com/blog/?p=20903
Why?
● error_log is too basic (message, file, line)● difficult to read / parse● depends on “error_reporting” setting
● monolog● phpconsole● log4php● RavenPHP + Sentry● FirePHP (dev environment)● Roll your own
Logging Options
Requirements (for everyone)
● Fire & forget● Minimum or zero latency● Highly available● Should be PSR-3 compatible● Log everything:
○ Exceptions○ Errors○ Fatal Errors
How they work...
source: http://mirror-sg-wv1.gallery.hd.org/_c/natural-science/cogs-with-meshed-teeth-AJHD.jpg.html
Capture Method
Data Storage
Logger (PSR-3)
Handler / Adapter
Typical PSR-3 Compatible Design
Monolog\ErrorHandler->handleException()
MongoDB
Monolog\Logger->log()
Monolog\Handler->handle()
Monolog
Ed\Log\Handler\ErrorHandler->handleException()
RabbitMQ
Ed\Log\Logger->log()
Ed\Log\Publisher\AmqpPublisher->publish()
Logging Server
Low Latency (using AMQP)
JSON payload
Capturing Logging
Use these and send output to $logger
● set_exception_handler()○ Handles all uncaught exceptions
● set_error_handler()○ Handles most errors
● register_shutdown_function()○ Handles fatal errors
Sending Log Messages
● PSR-3 makes it easy● However you want…● Monolog has loads:
○ syslog-compatible / error_log○ Email, HipChat○ AMQP, Sentry, Zend Monitor, Graylog2○ Redis, MongoDB, CouchDB
Summary
● PHP generates errors usually
● Exceptions are great in OOP context● More control with exceptions
● Logging is important● Logging is easy● Short term investment, long term benefit● NO EXCUSES!
Questions?
Feedback please...https://joind.in/9452
Thanks!
@asgrimgithub.com/asgrim