Errors, Exceptions & Logging (PHPNW13 Uncon)

Preview:

Citation preview

Errors, Exceptions & Loggingby James Titcumb

at PHPNW13 Uncon

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?

Thanks!

@asgrimgithub.com/asgrim