无法抓住Laravel 4的例外

时间:2014-10-29 16:14:59

标签: php laravel-4

我正在尝试在我的库中捕获Laravel异常。

namespace Marsvin\Output\JoomlaZoo;

class Compiler
{

    protected function compileItem($itemId, $item)
    {
        $boom = explode('_', $itemId);
        $boom[0][0] = strtoupper($boom[0][0]);
        $className = __NAMESPACE__."\\Compiler\\".$boom[0];

        try {
            $class = new $className(); // <-- This is line 38
        } catch(\Symfony\Component\Debug\Exception\FatalErrorException $e) {
            throw new \Exception('I\'m not being thrown!');
        }
    }
}

这是我得到的例外:

file: "C:\MAMP\htdocs\name\app\libraries\WebName\Output\JoomlaZoo\Compiler.php"
line: 38
message: "Class 'Marsvin\Output\JoomlaZoo\Compiler\Deas' not found"
type: "Symfony\Component\Debug\Exception\FatalErrorException"

班级名称是自愿错误的。

修改1:

我注意到如果我在try语句中抛出异常,我可以捕获异常:

try {
    throw new \Exception('I\'d like to be thrown!');
} catch(\Exception $e) {
    throw new \Exception('I\'m overriding the previous exception!'); // This is being thrown
}

1 个答案:

答案 0 :(得分:1)

问题是你试图在班上找到FatalErrorException,但是Laravel不会让致命的错误回到那里;它会立即终止。如果您试图捕获不同类型的异常,那么您的代码就可以正常工作。

您可以使用app/start/global.php中的App::fatal method来捕获和处理致命错误,但这不会帮助您处理库中的异常,或者以任何特异性处理异常。更好的选择是触发“可捕获”异常(例如来自Illuminate的异常),或者根据您要检查的条件抛出自定义异常。

在你的情况下,如果你的目标是处理未定义的类,这就是我的建议:

try {
    $className = 'BadClass';
    if (!class_exists($className)) {
        throw new \Exception('The class '.$className.' does not exist.');
    }
    // everything was A-OK...
    $class = new $className();
} catch( Exception $e) {
    // handle the error, and/or throw different exception
    throw new \Exception($e->getMessage());
}