Errors, Exceptions & Logging (PHP Hants Oct '13)

  • 5,397 views
Uploaded on

The talk is designed to give an entry-level introduction to how you should be handling errors, exceptions and how to effectively log in an application.

The talk is designed to give an entry-level introduction to how you should be handling errors, exceptions and how to effectively log in an application.

More in: Real Estate , Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
5,397
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
15
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Errors, Exceptions & Logging by James Titcumb at PHP Hampshire Oct ‘13
  • 2. Errors
  • 3. ● 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?
  • 4. Types of PHP Errors ● E_ERROR ● E_WARNING ● E_NOTICE ● E_PARSE ● Others (E_STRICT, E_DEPRECATED) etc. ● User errors (E_USER_ERROR etc.)
  • 5. E_ERROR <?php foo(); // Fatal error: Call to undefined function foo() in /in//in/N2gbL on line 3
  • 6. 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
  • 7. E_NOTICE <?php $a = $b; // Notice: Undefined variable: b in /in//in/9dPC5 on line 3
  • 8. E_PARSE <?php x c // Parse error: syntax error, unexpected 'c' (T_STRING) in /in//in/fkEaj on line 3
  • 9. Problems? source: http://www.dpaddbags.com/blog/episode-119-technology-sucks/
  • 10. 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”
  • 11. Ways Around // Will raise E_NOTICE fopen($somefile, 'r'); // No error! :) if (file_exists($somefile)) { fopen($somefile, 'r'); } else { // nice handling... }
  • 12. Exceptions
  • 13. ● 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?
  • 14. Jargon Buster ● throw Triggering an exception ● try Try to run a piece of code which *may* throw an exception ● catch Handle an exception ● finally Always run some code after a try/catch block
  • 15. ● Built in to PHP ● More descriptive than just “Exception”, e.g.: ○ InvalidArgumentException ○ LogicException ○ OutOfBoundsException ○ RuntimeException ○ see PHP manual for more SPL Exceptions
  • 16. Example (throw) class Division { public function divide($a, $b) { if ($b == 0) { throw new Exception(‘div by zero’); } return ($a / $b); } }
  • 17. Example (catch) $division = new Division(); try { $result = $division->divide(5, 0); } catch (Exception $exception) { $logger->warning($exception- >getMessage()); }
  • 18. Logging
  • 19. Why use logging? ● Easier to find problems ● More detail ● “paper trail” for code ● Log where you want
  • 20. What about Apache’s error_log? source: http://up-ship.com/blog/?p=20903
  • 21. Why? ● error_log is too basic (message, file, line) ● difficult to read / parse ● depends on “error_reporting” setting
  • 22. ● monolog ● phpconsole ● log4php ● RavenPHP + Sentry ● FirePHP (dev environment) ● Roll your own Logging Options
  • 23. Requirements (for everyone) ● Fire & forget ● Minimum or zero latency ● Highly available ● Should be PSR-3 compatible ● Log everything: ○ Exceptions ○ Errors ○ Fatal Errors
  • 24. How they work... source: http://mirror-sg-wv1.gallery.hd.org/_c/natural-science/cogs-with-meshed-teeth-AJHD.jpg.html
  • 25. Capture Method Data Storage Logger (PSR-3) Handler / Adapter Typical PSR-3 Compatible Design
  • 26. MonologErrorHandler ->handleException() MongoDB MonologLogger ->log() MonologHandler ->handle() Monolog
  • 27. EdLogHandlerErrorHandler ->handleException() RabbitMQ EdLogLogger ->log() EdLogPublisherAmqpPublisher ->publish() Logging Server Low Latency (using AMQP) JSON payload
  • 28. 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
  • 29. 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
  • 30. 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!
  • 31. Questions?
  • 32. Feedback please... https://joind.in/9452
  • 33. Thanks! @asgrim github.com/asgrim