pierrick

Pierrick Charron

Bronislaw Bialek

Bronislaw Bialek

Contents

PHP RFC: Catching Multiple Exception Types

Introduction

When two different types of exceptions are handled the same way, it is sometimes required to duplicate the code of the catch statements.

For example :

<?php
 
try {
   // Some code...
} catch (ExceptionType1 $e) {
   // Code to handle the exception
} catch (ExceptionType2 $e) {
   // Same code to handle the exception
} catch (Exception $e) {
   // ...
}

A solution to fix this problem on the user level would be to implement a common interface for ExceptionType1 and ExceptionType2 and catch it. However, this is only possible when you control the exception hierarchy in your own code, but not possible when you don't control the code.

Proposal

This RFC introduces the possibility to catch multiple exception types in a single catch statement to avoid code duplication.

<?php
 
try {
   // Some code...
} catch (ExceptionType1 | ExceptionType2 $e) {
   // Code to handle the exception
} catch (\Exception $e) {
   // ...
}

This syntax and functionality is compatible with the Union types RFC proposed here : https://wiki.php.net/rfc/union_types

When is it useful ?

  • When a single method/function throw two different types of exceptions that you handle the same way;
  • When libraries are leaking their dependency's exceptions.

Backward Incompatible Changes

None.

Proposed PHP Version(s)

7.1

RFC Impact

To SAPIs

None

To Existing Extensions

None

To Opcache

None

To PHP tools/IDE

This change will require every PHP tools and IDE based on an AST parser to be modified to take this syntax change into account.

Patches and Tests

Implementation

Votes

An option needs 2/3 votes to win

Should milti-catch be added to PHP 7.1 (87% approved)
User Vote
bishop Yes
blanchonvincent Yes
bwoebi Yes
colinodell Yes
danack Yes
daverandom Yes
davey Yes
derick No
dmitry Yes
francois Yes
galvao Yes
guilhermeblanco Yes
hywan Yes
jhdxr Yes
jpauli Yes
jwage Yes
kalle Yes
klaussilveira Yes
laruence No
lcobucci No
leigh Yes
levim Yes
lstrojny Yes
marcio Yes
mariano Yes
mbeccati Yes
mcmic Yes
mightyuhu Yes
mike Yes
ocramius No
patrickallaert No
pauloelr Yes
pierrick Yes
pollita Yes
ramsey Yes
rmf Yes
sammyk Yes
santiagolizardo Yes
stas Yes
svpernova09 Yes
thorstenr Yes
trowski Yes
tyrael Yes
weierophinney Yes
zeev Yes
zimt No