【问题标题】:LARAVEL -> Why try catch not work in Laravel?LARAVEL -> 为什么尝试 catch 在 Laravel 中不起作用?
【发布时间】:2025-12-15 15:40:01
【问题描述】:

我在 RouteServiceProvider 中有代码:

$router->bind('user', function ($value) {
    try{
        throw (new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException);
    }catch(Exception $e){
        exit('nott');
    }
});

我没有得到输出

nott

我来了

Sorry, the page you are looking for could not be found.
NotFoundHttpException in RouteServiceProvider.php line 75:
...

编辑: 这有效:

$router->bind('user', function ($value) {
    try{
        throw (new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException);
    }catch(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e){
        exit('addd');
    }
});

但这不起作用:

$router->bind('user', function ($value) {
    try{
        return (new User)->findOrFail(122);
    }catch(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e){
        exit('addd');
    }
});

【问题讨论】:

  • 离题,但一般来说,抓住一般Exception类被认为是不好的做法;相反,您应该捕获您预期会遇到的特定类型的异常。 (顺便说一句:捕获一般 Exception 类的做法被戏称为“口袋妖怪异常处理”——因为你会全部捕获)
  • 您遇到的问题与 Laravel 无关,与命名空间有关。在 PHP 类中使用命名空间时,必须引用它使用的所有类的完整命名空间。即使是*命名空间中的普通 PHP 也需要一个反斜杠来引用它们的命名空间。或者你可以告诉班级use 他们,然后你就不需要命名空间了。 (这同样适用于您正在使用的 Symphony 异常类以及任何其他类;您可以在类的顶部为它们添加一个 use 语句,然后您不需要在您的代码体。更整洁。

标签: php laravel laravel-4 laravel-5


【解决方案1】:
$router->bind('user', function ($value) {
    try{
        throw (new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException);
    }catch(\Exception $e){
        exit('nott');
    }
});

use Exception; //on top

    $router->bind('user', function ($value) {
        try{
            throw (new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException);
        }catch(Exception $e){
            exit('nott');
        }
    });

我想你现在明白你错过了什么。

【讨论】:

  • OP 可能在 Laravel 的 routes.php 文件中有这些代码,它没有任何命名空间表达式,因此 use Exception; 部分是不必要的。
  • 尝试捕获(\Illuminate\Database\Eloquent\ModelNotFoundException $e) 因为 findorfail 抛出模型未找到异常。