ID:               50250
 User updated by:  bran...@php.net
 Reported By:      bran...@php.net
-Status:           Feedback
+Status:           Open
 Bug Type:         Scripting Engine problem
 Operating System: *
 PHP Version:      5.3.1
 New Comment:

This report is about the fact that the PHP team closed a bug as
"wontfix" when someone complained that exceptions raised in autoloaders
could not be caught.

See http://bugs.php.net/bug.php?id=26193

Thus, there is an inconsistency in PHP, and one that should be resolved
to ensure that this isn't deemed a hole later on that must be "fixed,"
breaking code for those that thought this was by design.


Previous Comments:
------------------------------------------------------------------------

[2009-11-24 20:22:52] j...@php.net

So what is this report about? Are you really complaining because
something WORKS? If so, please change this to documentation issue.

------------------------------------------------------------------------

[2009-11-23 11:55:13] rquadl...@php.net

Amendeded the code slightly ...

<?php
echo "\n", PHP_VERSION;

if (function_exists('spl_autoload_register')) {
        function autoload($class) {
                throw new Exception('test');
                require $class . '.php';
        }
        spl_autoload_register('autoload');
} else {
        function __autoload($class) {
                throw new Exception('test');
                require $class . '.php';
        }
}

try {
        new NoExist();
} 
catch (Exception $e) {
        echo "unable to load the class.\n";
}


5.0.0
Fatal error: __autoload(NoExist) threw an exception of type 
'Exception' in Z:\testauto.php on line 29

5.0.1 - 5.0.5
Fatal error: Function __autoload(NoExist) threw an exception of type 
'Exception' in Z:\testauto.php on line 29

5.1.0 - 5.2.11
Fatal error: Class 'NoExist' not found in Z:\testauto.php on line 29

5.3.0 - 5.3.1
unable to load the class.


And using MissingException

5.0.0 - 5.0-5
Fatal error: Class 'MissingException' not found in Z:\testauto.php on 
line 12

5.1.0 - 5.3.1
Fatal error: Class 'MissingException' not found in Z:\testauto.php on 
line 6



------------------------------------------------------------------------

[2009-11-23 11:36:21] rquadl...@php.net

One instance where the documentation does hold true is attempting to 
throw an exception of a type which is not available.

Changing ...

throw new Exception('test');

to ...

throw new MissingException('test');

results in ...

Fatal error: Class 'MissingException' not found in Z:\testauto.php on 
line 6


I wonder if this is what the documentation is relating to.

------------------------------------------------------------------------

[2009-11-20 20:14:30] bj...@php.net

This is also true for __autoload(), not only spl_register_autoload().

Bug or expected behavior as of PHP 5.3.0?


------------------------------------------------------------------------

[2009-11-20 19:50:03] bran...@php.net

Description:
------------
According to the PHP documentation, exceptions cannot be thrown inside
__autoload() functions, and prior to PHP 5.3, exceptions thrown resulted
in fatal errors. Since PHP 5.3, it has been possible to throw and catch
exceptions from __autoload() functions.

I'm happy to chalk this up to a documentation bug, and if it is I will
gladly fix it myself; however, I want to make sure this is intended
functionality and not an accidental inclusion that might be fixed in
future versions of PHP.

Reproduce code:
---------------
<?php

function autoload($class)
{

throw new Exception('test');
require $class . '.php';

}

spl_autoload_register('autoload');

try {
        new NoExist();
} 
catch (Exception $e)
{
        echo 'unable to load the class.';
}

Expected result:
----------------
Fatal error, as the autoloader throws an exception which is not
allowed.

Actual result:
--------------
string of "unable to load the class."


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=50250&edit=1

Reply via email to