Hubro
Hubro

Reputation: 59408

Why isn't my Exception being caught by catch?

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

Upvotes: 21

Views: 7951

Answers (4)

Hubro
Hubro

Reputation: 59408

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.

Upvotes: 49

John T.
John T.

Reputation: 491

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?

Upvotes: 0

Andreas Helgegren
Andreas Helgegren

Reputation: 1678

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.';
}


?>

Upvotes: 3

Mathieu Dumoulin
Mathieu Dumoulin

Reputation: 12244

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.

Upvotes: 2

Related Questions