try/catch PHP不';捕获异常(laravel控制器)
我正在与Laravel合作,并尝试使用try/catch,就像我对java所做的那样。不幸的是,它没有按预期工作。。。该异常未被捕获,它不会返回错误消息,而是生成422异常 以下是我的功能: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
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上测试并使用过的相同消息