You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()返回空字符串。

解决方法

方案一:调用父类构造并传递消息

  1. 修改异常类,添加构造函数调用父类方法:
<?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);
    }
}
  1. 抛出异常时传入错误消息:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:00:47