为了账号安全,请及时绑定邮箱和手机立即绑定

try/catch PHP 不捕获异常(laravel 控制器)

try/catch PHP 不捕获异常(laravel 控制器)

PHP
互换的青春 2021-09-05 16:38:14
我正在使用 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 Unprocessable Entity {"message":"给定的数据无效。","errors":{"newpassword":["新密码必须至少为6个字符。"]}}
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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

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

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

2) Laravel 有一个拦截器,可以在错误发生时捕获错误,并且该处理程序已被注入以优先于您的处理程序。 SO表单验证异常未捕获

希望这会推动您朝着正确的方向前进。对不起,这是一个非回答类型的答案。


查看完整回答
反对 回复 2021-09-05
?
缥缈止盈

TA贡献2041条经验 获得超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();

    }

}


查看完整回答
反对 回复 2021-09-05
  • 3 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信