Slide 1

Slide 1 text

Tommy Mühle | tommy-muehle.io Exception handling classic & fancy 1

Slide 2

Slide 2 text

Tommy Mühle | tommy-muehle.io Tommy Mühle 
 Software Engineer Author 2

Slide 3

Slide 3 text

Tommy Mühle | tommy-muehle.io What is an Exception? 3

Slide 4

Slide 4 text

Tommy Mühle | tommy-muehle.io Tommy Mühle | tommy-muehle.io 4 „An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions.“ https:/ /docs.oracle.com

Slide 5

Slide 5 text

Tommy Mühle | tommy-muehle.io 5 http://php.net/manual/en/class.exception.php

Slide 6

Slide 6 text

Tommy Mühle | tommy-muehle.io 6 http://php.net/manual/en/class.errorexception.php

Slide 7

Slide 7 text

Tommy Mühle | tommy-muehle.io Catching 7

Slide 8

Slide 8 text

Tommy Mühle | tommy-muehle.io 8 /* @var $connection \Doctrine\DBAL\Connection */ $connection->beginTransaction(); try { // ... $connection->commit(); } catch (\Exception $exception) { $connection->rollBack(); throw $exception; }

Slide 9

Slide 9 text

/* @var $connection \Doctrine\DBAL\Connection */ $connection->beginTransaction(); try { // ... $connection->commit(); } catch (Doctrine\DBAL\DBALException $exception) { $connection->rollBack(); } catch (\Exception $exception) { // ... throw $exception; } Tommy Mühle | tommy-muehle.io 9

Slide 10

Slide 10 text

Tommy Mühle | tommy-muehle.io 10 /* @var $connection \Doctrine\DBAL\Connection */ $connection->beginTransaction(); try { // ... $connection->commit(); } catch (\Exception $exception) { $connection->rollBack(); throw $exception; } finally { /* @var $logger \Monolog\Logger */ $logger->info('...'); }

Slide 11

Slide 11 text

Tommy Mühle | tommy-muehle.io If you throw something, you have to catch it. 11

Slide 12

Slide 12 text

Tommy Mühle | tommy-muehle.io Handling 12

Slide 13

Slide 13 text

Tommy Mühle | tommy-muehle.io 13 function my_handler($exception) { echo 'Got it: ' . $exception->getMessage(); } set_exception_handler('my_handler'); throw new Exception('Take this!');

Slide 14

Slide 14 text

Tommy Mühle | tommy-muehle.io PHP version specifications 14

Slide 15

Slide 15 text

Tommy Mühle | tommy-muehle.io PHP 5 15

Slide 16

Slide 16 text

Tommy Mühle | tommy-muehle.io PHP 5 16

Slide 17

Slide 17 text

Tommy Mühle | tommy-muehle.io It’s dead, Jim. 17

Slide 18

Slide 18 text

Tommy Mühle | tommy-muehle.io Exception hierarchy 18

Slide 19

Slide 19 text

Tommy Mühle | tommy-muehle.io 19 http://php.net/manual/en/spl.exceptions.php

Slide 20

Slide 20 text

Tommy Mühle | tommy-muehle.io Error as exception 20

Slide 21

Slide 21 text

Tommy Mühle | tommy-muehle.io 21 function exception_error_handler ($severity, $message, $file, $line) { throw new ErrorException ($message, 0, $severity, $file, $line); } set_error_handler('exception_error_handler'); strpos(); // Trigger exception

Slide 22

Slide 22 text

Tommy Mühle | tommy-muehle.io PHP 7 22

Slide 23

Slide 23 text

Tommy Mühle | tommy-muehle.io PHP 7 22

Slide 24

Slide 24 text

Tommy Mühle | tommy-muehle.io NEW Advanced exception hierarchy 23

Slide 25

Slide 25 text

Tommy Mühle | tommy-muehle.io 24 http://php.net/manual/en/language.errors.php7.php

Slide 26

Slide 26 text

Tommy Mühle | tommy-muehle.io 25 http://php.net/manual/en/class.throwable.php

Slide 27

Slide 27 text

Tommy Mühle | tommy-muehle.io 26 http://php.net/manual/en/class.error.php

Slide 28

Slide 28 text

Tommy Mühle | tommy-muehle.io 27 try { // ... } catch (Error $error) { // ... } catch (Exception $exception) { // ... }

Slide 29

Slide 29 text

Tommy Mühle | tommy-muehle.io PHP 7.1 28

Slide 30

Slide 30 text

Tommy Mühle | tommy-muehle.io Catching Multiple Exception Types 29

Slide 31

Slide 31 text

try { // ... } catch (LengthException | OutOfRangeException $exception) { // ... } catch (Exception $exception) { // ... } Tommy Mühle | tommy-muehle.io 30

Slide 32

Slide 32 text

Tommy Mühle | tommy-muehle.io Throw Error in Extensions 31

Slide 33

Slide 33 text

Tommy Mühle | tommy-muehle.io 32 try { $myDateTime = unserialize('O:8:"DateTime":...";}'); // ... } catch (Error $error) { // ... }

Slide 34

Slide 34 text

Tommy Mühle | tommy-muehle.io Best practices 33

Slide 35

Slide 35 text

Tommy Mühle | tommy-muehle.io Build custom exceptions upon SPL ones. 34

Slide 36

Slide 36 text

class FileNotFoundException extends InvalidArgumentException { } class FileNotReadableException extends RuntimeException { } Tommy Mühle | tommy-muehle.io 35 Build upon SPL exceptions

Slide 37

Slide 37 text

Tommy Mühle | tommy-muehle.io Differentiate between logical and runtime exceptions. 36

Slide 38

Slide 38 text

Tommy Mühle | tommy-muehle.io Help developers with creating logical exceptions. 37

Slide 39

Slide 39 text

Tommy Mühle | tommy-muehle.io Create unavoidable
 runtime exceptions 
 if necessary. 38

Slide 40

Slide 40 text

Tommy Mühle | tommy-muehle.io Create fully qualified 
 named exceptions. 39

Slide 41

Slide 41 text

Tommy Mühle | tommy-muehle.io 40 class NotFoundException extends Exception { // ... } Avoid unconcrete names

Slide 42

Slide 42 text

class FileNotReadableException extends RuntimeException { } Tommy Mühle | tommy-muehle.io 41 Use fully qualified names

Slide 43

Slide 43 text

Tommy Mühle | tommy-muehle.io Add codes for 
 your exceptions. 42

Slide 44

Slide 44 text

Tommy Mühle | tommy-muehle.io 43 class FileNotReadableException extends RuntimeException { public function __construct(string $filename) { $message = sprintf('Cannot read %s!', $filename); $code = 666; parent::__construct($message, $code, null); } } Use specific codes

Slide 45

Slide 45 text

Tommy Mühle | tommy-muehle.io Use named constructors for specific use cases. 44

Slide 46

Slide 46 text

Tommy Mühle | tommy-muehle.io 45 $url = 'unreachable.tld'; if ('' === $url) { throw new InvalidUrlException('Blank url are invalid!'); } if ('' === parse_url($url, PHP_URL_SCHEME)) { $message = sprintf('The url %s has no scheme!', $url); throw new InvalidUrlException($message); } // ... Avoid inline message generation

Slide 47

Slide 47 text

Tommy Mühle | tommy-muehle.io 46 class InvalidUrlException extends InvalidArgumentException { private static function create(string $reason) { return new static($reason); } public static function blankUrl() { return static::create('Blank url are invalid!'); } } Use named constructors

Slide 48

Slide 48 text

Tommy Mühle | tommy-muehle.io 47 class InvalidUrlException extends InvalidArgumentException { // ... public static function blankUrl() { return static::create('Blank url are invalid!'); } public static function noScheme(string $url) { $reason = sprintf('The url %s has no scheme!', $url); return static::create($reason); } // ... } One method for each case

Slide 49

Slide 49 text

Tommy Mühle | tommy-muehle.io 48 $url = 'unreachable.tld'; if ('' === $url) { throw InvalidUrlException::blankUrl(); } if ('' === parse_url($url, PHP_URL_SCHEME)) { throw InvalidUrlException::noScheme($url); } // ...

Slide 50

Slide 50 text

Tommy Mühle | tommy-muehle.io Centralize own perseverative exceptions. 49

Slide 51

Slide 51 text

Tommy Mühle | tommy-muehle.io Writing code to support PHP 5.x and 7 exceptions. 50

Slide 52

Slide 52 text

Tommy Mühle | tommy-muehle.io 51 try { // Code that may throw an Exception or Error. } catch (Throwable $exception) { // Executed only in PHP 7, // will not match in PHP 5.x } catch (Exception $exception) { // Executed only in PHP 5.x, // will not be reached in PHP 7 }

Slide 53

Slide 53 text

Tommy Mühle | tommy-muehle.io And now show 
 me some fancy stuff 52

Slide 54

Slide 54 text

Tommy Mühle | tommy-muehle.io 53

Slide 55

Slide 55 text

Tommy Mühle | tommy-muehle.io You send critical data to somebody else. 54

Slide 56

Slide 56 text

Tommy Mühle | tommy-muehle.io 55 https://rollbar.com/demo/demo/

Slide 57

Slide 57 text

Tommy Mühle | tommy-muehle.io 55 https://rollbar.com/demo/demo/ https://angel.co/bugsnag/jobs

Slide 58

Slide 58 text

Tommy Mühle | tommy-muehle.io 55 https://rollbar.com/demo/demo/ https://angel.co/bugsnag/jobs https://www.g2crowd.com/products/raygun-crash-reporting/details

Slide 59

Slide 59 text

Tommy Mühle | tommy-muehle.io 56

Slide 60

Slide 60 text

Tommy Mühle | tommy-muehle.io Tommy Mühle | tommy-muehle.io 57 „Sentry is 100% open source. All features are built in the open and can be followed and contributed to on GitHub.“ https:/ /sentry.io/about

Slide 61

Slide 61 text

Tommy Mühle | tommy-muehle.io 58 https://github.com/getsentry/sentry

Slide 62

Slide 62 text

Tommy Mühle | tommy-muehle.io 59 https://hub.docker.com/_/sentry/

Slide 63

Slide 63 text

Tommy Mühle | tommy-muehle.io Client usage 60

Slide 64

Slide 64 text

Tommy Mühle | tommy-muehle.io 61 $sentryClient = new Raven_Client( 'https://:@sentry.io/' ); // or $sentryClient->install(); $error_handler = new Raven_ErrorHandler($sentryClient); $error_handler->registerExceptionHandler(); $error_handler->registerErrorHandler(); $error_handler->registerShutdownFunction();

Slide 65

Slide 65 text

Tommy Mühle | tommy-muehle.io 62 $sentryClient->captureException($exception, [ 'extra' => [ 'php_version' => phpversion(), 'foo' => 'bar', // ... ], 'logger' => 'default', 'tags' => ['key' => 'value'], // group event by 'fingerprint' => ['{{ default }}', 'other value'], ]);

Slide 66

Slide 66 text

Tommy Mühle | tommy-muehle.io 63

Slide 67

Slide 67 text

Tommy Mühle | tommy-muehle.io 64

Slide 68

Slide 68 text

Tommy Mühle | tommy-muehle.io 65

Slide 69

Slide 69 text

Tommy Mühle | tommy-muehle.io 66

Slide 70

Slide 70 text

Tommy Mühle | tommy-muehle.io 67

Slide 71

Slide 71 text

Questions?

Slide 72

Slide 72 text

Thank you! Slides http:/ /bit.ly/2kzZkjx Images https:/ /pixabay.com/ @tommy_muehle