Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
try/catch PHP不';捕获异常(laravel控制器)_Php_Laravel_Exception - Fatal编程技术网

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

try/catch PHP不';捕获异常(laravel控制器),php,laravel,exception,Php,Laravel,Exception,我正在与Laravel合作,并尝试使用try/catch,就像我对java所做的那样。不幸的是,它没有按预期工作。。。该异常未被捕获,它不会返回错误消息,而是生成422异常 以下是我的功能: public function changePassword(Request $request){ try{ if (!(Hash::check($request->get('currentpassword'), Auth::user()->passwo

我正在与Laravel合作,并尝试使用try/catch,就像我对java所做的那样。不幸的是,它没有按预期工作。。。该异常未被捕获,它不会返回错误消息,而是生成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”:[“newpassword必须至少包含6个字符。”]}

非常感谢使用
getMessage()
方法。例如:-

$error->getMessage();
在挡块中使用此选项。这对你有用。享受

你可以试试这个

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();
        }
   }

您的错误处理代码是正确的。捕捉异常的代码是在PHP中实现的,其工作方式与Java中相同(我已经编写了这两种代码)。简而言之,您的代码没有问题

我的猜测是两件事中的一件,但我对其中任何一件都不是100%肯定:

1) 您正在OSX上进行测试,一些XDebug设置可能会在大量嵌套的情况下导致错误处理问题(我在迁移中亲身经历过这种情况)。

2) Laravel有一个拦截器,它在错误发生时捕获错误,并且该处理程序已被注入以优先于处理程序。


希望这会把你推向正确的方向。很抱歉,这是一个非答案类型的答案。

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();
    }
}

在返回$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
@if(会话('error'))
{{session('error')}
@恩迪夫

您如何发送请求?非常感谢,但它没有真正“捕获”异常:我的POST请求返回一个异常:app.js:800 POST 422(不可处理实体)app.js:Uncaught(in promise)错误:请求失败,状态代码为422,位于CreateError谢谢,但正如我回答Sahil一样,非常感谢,但它没有真正“捕获”异常:my POST请求不返回消息,但出现异常:app.js:800 POST 127.0.0.1/memberform/changePassword 422(不可处理实体)app.js:Uncaught(in promise)错误:请求失败,状态代码422位于createError–正在使用的validate()方法抛出ValidationException。查看一下Validator类(位于laravel 5.6上的vendor/laravel/framework/src/illumb/Validation/Validator中)!你会得到我在laravel上测试并使用过的相同消息