在Laravel / Lumen PHP框架中捕获异常的最佳方法是什么?这很可能是一般适用于PHP的问题。
目前,我有一个UsersController调用(在try块中)" findByUsernameOrFail'我的User类中的方法。如果找不到用户名,则此方法将抛出异常,但catch块未捕获异常!为什么呢?
class UsersController extends Controller {
public function show($username)
{
try
{
$user = \App\User::findByUsernameOrFail($username);
return $user;
}
catch(Exception $e)
{
// This doesn't work. This code is never called because Laravel
return $this->setStatusCode(404)->respondWithError('Username Not Found!');
}
}
'显示'此UsersController中的方法是调用名为' findByUsernameOrFail'的方法。在用户模型中。如果它通过用户名找到用户,则返回找到的$ user对象。如果它没有通过用户名找到用户,则会抛出异常。但是,出于某种原因,此异常未被捕获,而Laravel正在生成一般错误页面。
这是我的用户模型中的一些代码:
class User extends Illuminate\Database\Eloquent\Model {
public static function findByUsernameOrFail($username)
{
if ( ! is_null($user = static::whereUsername($username)->first()))
{
return $user;
}
throw new Illuminate\Database\Eloquent\ModelNotFoundException;
}
}
这是我尝试运行时会发生什么情况的屏幕截图:
为什么'赶上'我的部分代码从未执行过!?我想要发生的是我的应用程序优雅地返回HTTP 404错误,该错误表明无法找到用户!根据我对Try / Catch和Exceptions的了解,我的代码应该工作,但显然我错过了一些东西。
如何让此代码按此代码的意图返回HTTP 404错误消息?
答案 0 :(得分:5)
根据建议,您可能需要明确声明您正在侦听的异常。所以正确的方法是
catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
// do your stuff.
}
但是在Laravel你可以超越这个并使它非常抽象(就像Laravel中的几乎所有东西一样)
如果您在app/Exceptions/Handler.php
方法中打开render
,您可能会听到整个应用程序中抛出的各种异常。
因此,对于您的具体情况,可能如下:
if ($e instanceof ModelNotFoundException) {
abort(404);
}
(别忘了导入顶部的完整路径)
如@Phroggyy所述,您可以使用Laravel的findOrFail()
方法内联您的代码。在幕后,它将完全按照您手动执行的操作 - 尝试查找模型并在未找到时抛出异常。
答案 1 :(得分:2)
我无法用英语解释为什么会这样。我说英语很糟糕。只是尝试将catch(Exception $e)
更改为catch(ModelNotFoundException $e)
答案 2 :(得分:0)
使用 catch(\ Exception $ e) 代替 catch(异常$ e)