【问题标题】:try/catch PHP doesn't catch exceptions (laravel controller)try/catch PHP 不捕获异常(laravel 控制器)
【发布时间】:2019-11-09 19:17:53
【问题描述】:

我正在使用 Laravel 并尝试像使用 java 一样使用 try/catch。不幸的是,它没有按预期工作...该异常没有被捕获,并且没有返回错误消息,而是产生了 422 异常。

这是我的功能:

public function changePassword(Request $request){

        try{
            if (!(Hash::check($request->get('currentpassword'), Auth::user()->password))) {
                return "Your current password does not matches with the password you provided. Please try again.";
            }

            if(strcmp($request->get('currentpassword'), $request->get('new-password')) == 0){
                return "New Password cannot be same as your current password. Please choose a different password.";
            }

            $validatedData = $request->validate([
                'currentpassword' => 'required',
                'newpassword' => 'required|string|min:6',
            ]);

            $user = Auth::user();
            $user->password = bcrypt($request->get('newpassword'));
            $user->save();

            return "Password changed successfully !";
        }
        catch(Exception $error){
            return $error->getMessage();
        }
   }

我这样称呼这个方法

Route::post('memberform/changePassword','MemberController@changePassword')->name('changePassword');

在这里我想得到我的异常消息,并显示它。相反,我在使用我的请求时遇到了错误,并且没有捕获到这个异常

422 无法处理的实体 {"message":"给定的数据无效。","errors":{"newpassword":["新密码必须至少为 6 个字符。"]}}

非常感谢

【问题讨论】:

  • 你是如何发送请求的?

标签: php laravel exception


【解决方案1】:

使用getMessage()method.eg:-

$error->getMessage();

在 catch 块中使用它。它会为你工作。尽情享受吧!

【讨论】:

  • 非常感谢,但它并没有真正“捕获”异常:我的 POST 请求返回异常:app.js:800 POST 127.0.0.1/memberform/changePassword422 (Unprocessable Entity) app.js:Uncaught (在承诺中)错误:请求在 createError 时失败,状态码为 422
【解决方案2】:

你可以试试这个

public function changePassword(Request $request){

        try{
            if (!(Hash::check($request->get('currentpassword'), Auth::user()->password))) {
                return "Your current password does not matches with the password you provided. Please try again.";
            }

            if(strcmp($request->get('currentpassword'), $request->get('new-password')) == 0){
                return "New Password cannot be same as your current password. Please choose a different password.";
            }

            $validatedData = $request->validate([
                'currentpassword' => 'required',
                'newpassword' => 'required|string|min:6',
            ]);

            $user = Auth::user();
            $user->password = bcrypt($request->get('newpassword'));
            $user->save();

            return "Password changed successfully !";
        }
        catch(\Exception $error){
            return $error->getMessage();
        }
   }

【讨论】:

  • 谢谢,但我也回答了 Sahil,非常感谢,但它并没有真正“捕捉”异常:我的 POST 请求没有返回消息,而是返回异常:app.js: 800 POST 127.0.0.1/memberform/changePassword 422 (Unprocessable Entity) app.js:Uncaught (in promise) Error: Request failed with status code 422 at createError –
【解决方案3】:

您的错误处理代码是正确的。您用于捕获异常的代码是在 PHP 中执行此操作的方式,并且它的工作方式与在 Java 中的工作方式相同(我都编写了代码)。简而言之,您的代码没有任何问题。

我的猜测是两件事之一,我不能 100% 确定其中任何一个:

1) 您正在 OSX 上进行测试,当事物大量嵌套时,一些 XDebug 设置可能会导致错误处理问题(我个人在迁移中遇到过这种情况)。 SO XDebug settings problem

2) Laravel 有一个拦截器,可以在错误发生时捕获错误,并且该处理程序已被注入以优先于您的处理程序。 SO form validation exception not catching

希望这会推动您朝着正确的方向前进。很抱歉,这是一个非答案类型的答案。

【讨论】:

    【解决方案4】:

    Laravel 验证失败不会抛出异常!!所以你无法捕捉......如果你想捕捉,请使用下面的自定义验证并自己抛出异常

    public function changePassword(Request $request)
    {
        try
        {
           $data['currentpassword'] = $request->get('currentpassword');
           $data['newpassword'] = $request->get('newpassword');
            if (!(Hash::check($request->get('currentpassword'), Auth::user()->password))) {
                $message['currentpassword.required'] = "Your current password does not matches with the password you provided. Please try again.";
                $data['currentpassword'] = ""; // I used for required rule as a example , but I recommend to create custom rule for this
            }
    
            if(strcmp($request->get('currentpassword'), $request->get('new-password')) == 0){
                $message['newpassword.required'] = "New Password cannot be same as your current password. Please choose a different password.";
                $data['newpassword'] = "";// I used for required rule as a example , but I recommend to create custom rule for this
            }
    
            $rule = [
                'currentpassword' => 'required',
                'newpassword' => 'required|string|min:6',
            ];
            $validatedData = \Illuminate\Support\Facades\Validator::make($data, $rule, $message);
            if($validateData->fails()) {
               throw new \Exception($validateData->messages());
            }
    
            $user = Auth::user();
            $user->password = bcrypt($request->get('newpassword'));
            $user->save();
    
            return "Password changed successfully !";
        }
        catch(Exception $error)
        {
            return $error->getMessage();
        }
    }
    

    【讨论】:

    • 正在使用的 validate() 方法会引发 ValidationException。查看 Validator 类(在 Laravel 5.6 上位于 vendor/laravel/framework/src/Illuminate/Validation/Validatot)。
    • 扔什么!您将收到我在 laravel 上测试并使用过的相同消息
    【解决方案5】:

    你在哪里返回$error,你可以在view()中返回$error或者使用redirect()或者response()等...

    示例:

    return back()->back()->withError($error->getMessage())->withInput();
    

    另一个例子:

    return response()->json('error_message' => $error->getMessage());
    

    希望你能明白。

    在刀片视图中,您可以像这样显示 $error 消息:

    @if (session('error'))
        <div class="alert alert-danger" style="margin-top: 0.2rem;">
            {{ session('error') }}
        </div>
    @endif
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 2011-05-27
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多