|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-02-16 21:09 UTC] benjcarson at digitaljunkies dot ca
Description:
------------
If an exception is thrown within a try block and more than two catch blocks follow, the exception may not be caught. If the exception matches either of the first two catch blocks then the exception will be caught. However, if the exception does not match the first two catch blocks, it will skip any remaining catch blocks and remain uncaught.
In the code below, the exception is caught properly if the second catch block is commented out. Once it is included again though, the exception is not caught.
Reproduce code:
---------------
<?php
class Ex1 extends Exception { }
class Ex2 extends Exception { }
class Ex3 extends Exception { }
try {
throw new Ex3("Ex3");
} catch (Ex1 $e) {
echo ("Ex1: " . $e->getMessage() ."\n");
} catch (Ex2 $e) {
echo ("Ex2: " . $e->getMessage() ."\n");
} catch (Exception $e) { // Note: trying to catch Ex3 also fails
echo ("Exception: " . $e->getMessage() . "\n");
}
exit(0);
?>
Expected result:
----------------
Execption: Ex3
Actual result:
--------------
Fatal error: Uncaught exception 'Ex3' with message 'Ex3' exception.php:8
Stack trace:
#0 {main}
thrown in exception.php on line 8
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 20:00:01 2025 UTC |
For now we've had to use this workaround: <?php class Ex1 extends Exception { } class Ex2 extends Exception { } class Ex3 extends Exception { } try { throw new Ex3("Ex3"); } catch (Exception $e) { if ($e instanceof Ex1) echo ("Ex1: " . $e->getMessage() . "\n"); else if ($e instanceof Ex2) echo ("Ex2: " . $e->getMessage() . "\n"); else if ($e instanceof Ex3) echo ("Ex3: " . $e->getMessage() . "\n"); else echo ("Exception: " . $e->getMessage() . "\n"); }