我正在尝试在我的库中捕获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
}
答案 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());
}