== Why is this an issue?

Exceptions handlers (``++catch++``) are evaluated in the order they are written. Once a match is found, the evaluation stops.


In some contexts a ``++catch++`` block is dead code as it will never catch any exception:

* If there is a handler for a base class followed by a handler for class derived from that base class, the second handler will never trigger: the handler for the base class will match the derived class, and will be the only executed handler.
* When multiple ``++catch++`` blocks try to catch the same exception class, only the first one will be executed.

This rule raises an issue when a ``++catch++`` block catches every exception before a later ``++catch++`` block could catch it.

=== Noncompliant code example

[source,php]
----
class MyException extends Exception {}
class MySubException extends MyException {}

try {
  doSomething();
} catch (MyException $e) {
  echo $e;
} catch (MySubException $e) { // Noncompliant: MySubException is a subclass of MyException
  echo "Never executed";
}
----

=== Compliant solution

[source,php]
----
class MyException extends Exception {}
class MySubException extends MyException {}

try {
  doSomething();
} catch (MySubException $e) {
  echo "Executed";
} catch (MyException $e) {
  echo $e;
}
----

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../highlighting.adoc[]

'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]

endif::env-github,rspecator-view[]
