Laravel自定义CustomerHasVoucherException的getMessage()返回空值问题
自定义异常getMessage()返回空的解决方法
问题描述
创建了CustomerHasVoucherException自定义异常类,但在控制器中捕获该异常后,调用$e->getMessage()返回空错误信息。
异常类代码
<?php namespace Modules\Customer\Exceptions; use Exception; class CustomerHasVoucherException extends Exception { public function report() { return false; } public function render($request, $exception) { $request->headers->set('Accept', 'application/json'); return response()->json((['message' => 'customer already has a voucher!']), 406); } }
控制器方法代码
public function reserveVoucher(CustomerRepository $customerRepository, CampaignRepository $campaignRepository, Request $request, $customer_id, $campaign_code) { // dd($campaign_code, $customer_id); try { $customer = $customerRepository->checkEligibility($customer_id); $campaignRepository->beginTransaction(); $voucher = $campaignRepository->reserveVoucher($campaign_code, $customer); $campaignRepository->commitTransaction(); return response()->json( ['message' => "Your voucher is reserved! Procced to next step within " . \Config::get('voucher.campaign.voucher.max_reservation_time') . " minutes."], 200 ); } catch (CustomerHasVoucherException $e) { report($e); return response()->json(['error' => $e->getMessage()]); } catch (\Throwable $th) { report($th); return response()->json(['error' => $th->getMessage()]); } }
返回响应
{ "error": "" }
问题原因
自定义异常类未调用父类Exception的构造函数初始化错误消息,也未重写getMessage()方法。当抛出异常时,父类的$message属性为空,导致$e->getMessage()返回空字符串。
解决方法
方案一:调用父类构造并传递消息
- 修改异常类,添加构造函数调用父类方法:
<?php namespace Modules\Customer\Exceptions; use Exception; use Throwable; class CustomerHasVoucherException extends Exception { public function __construct($message = "", $code = 0, Throwable $previous = null) { parent::__construct($message, $code, $previous); } public function report() { return false; } public function render($request, $exception) { $request->headers->set('Accept', 'application/json'); return response()->json(['message' => 'customer already has a voucher!'], 406); } }
- 抛出异常时传入错误消息:
throw new CustomerHasVoucherException('customer already has a voucher!');
方案二:重写getMessage()方法返回固定消息
直接在异常类中重写getMessage(),返回预设的错误内容:
<?php namespace Modules\Customer\Exceptions; use Exception; class CustomerHasVoucherException extends Exception { public function report() { return false; } public function getMessage() { return 'customer already has a voucher!'; } public function render($request, $exception) { $request->headers->set('Accept', 'application/json'); return response()->json(['message' => $this->getMessage()], 406); } }
两种方案都能让控制器中$e->getMessage()返回正确的错误信息。
内容的提问来源于stack exchange,提问作者Amit Shah
相关产品推荐
相关产品推荐

