20
votes

I have some code that looks like this

# Try to import file
try
{
    DataManager::fileImport($_FILES['datafile']['tmp_name'], 
                            $_POST['zones'], $_POST['statuses']);
}
catch(Exception $e)
{
    print 'Herp.';
    $response->body = Helpers::getVarDump($e);
}

DataManager::fileImport is literally a one-line function that throws a normal Exception:

static function fileImport($filepath, $zones, $statuses)
{
    throw new Exception('SOME EXCEPTION');
}

And yet I get

Fatal error: Uncaught exception 'Exception' with message 'SOME EXCEPTION'...

From the try block. Also 'Herp.' is never printed. Why doesn't the Exception trigger the catch block?


EDIT: I should mention I'm using Tonic and PHP 5.3.9

EDIT AGAIN: Here's DataManager (with names replaced with ... for anonymity) http://pastebin.com/daHWBJDC

4
It should work. Are you perhaps not showing actual code, and throwing some RandomLyNamedException which does not extend Exception? - Wrikken
This looks correct. Are you sure that this is the only place where you are calling this fileImport method? If there are others, I would make sure they are also being caught. - Zack Marrapese
If using 5.3+, did you check your namespaces? - Sander Marechal
I just made the class and that's the only place the function is being called. I also checked the line number in the stack trace - Hubro
This is the DataManager class pastebin.com/daHWBJDC (With some names replaced with ... for anonymity) - Hubro

4 Answers

47
votes

Solution

I neglected to specify use \Exception; in the file containing the try/catch.

Pondering

I know it's intentional that each namespace in PHP should define its own Exception for many reasons, but I still find it odd that catch(Exception e) didn't cause any errors when Exception in that context wasn't defined. If I were to write new Exception() I would get an error.

Oh well, at least I learned something.

3
votes

Strange. If i run this code i get the "Herp."

<?php

class DataManagerTest {
    static function fileImport($filepath, $zones, $statuses)
    {
        throw new Exception('SOME EXCEPTION');
    }
}

# Try to import file
try
{
    DataManagerTest::fileImport("param1","param2","param3");
}
catch(Exception $e)
{
    print 'Herp.';
}


?>
2
votes

You might have an issue with your DataManager class because i copied your code, adapted it to run and i get the exception handled... You problem is elsewhere...

class DataManager {
    static function fileImport($filepath, $zones, $statuses){
        throw new Exception('SOME EXCEPTION');
    }
}

try{
    DataManager::fileImport('', '', '');
}catch(Exception $e){
    print 'Herp.';
}

Results in

Herp.
0
votes

4 years later...

@Hubro, thank you for saving me with that namespace fix!

It does seem counterintuitive at first that it's necessary when throwing a root-level Exception, even though it ultimately makes sense in the general context of namespaces.

For anyone who doesn't want to utilize @Hubro's file-level fix:

use \Exception;

You could instead add the backslash in front of Exception in the higher level catch block:

} catch (\Exception $e) {

We could all benefit from someone smarter than me providing suggestions on best practices around defining a custom Exception for each namespace. Any takers?