Laravel中如何隐藏SMS服务API报错并保障程序正常运行?
实现静默发送短信不中断程序的方案
你可以根据自己的使用场景选择以下任意一种方案:
方案1:全局忽略Kavenegar相关异常
如果所有场景下调用Kavenegar接口失败都不需要报错,直接在全局异常处理器中配置即可:
修改app/Exceptions/Handler.php的register方法:
public function register() { // 忽略Kavenegar接口返回的业务错误(如api key错误、余额不足、签名错误等) $this->reportable(function (\Kavenegar\Exceptions\ApiException $e) { // 可选:将错误写入日志,方便后续排查 // \Log::error('Kavenegar API错误:' . $e->getMessage()); return false; }); // 忽略Kavenegar接口请求的网络错误 $this->reportable(function (\Kavenegar\Exceptions\HttpException $e) { // \Log::error('Kavenegar 网络错误:' . $e->getMessage()); return false; }); }
该方案会全局屏蔽Kavenegar的所有API和网络异常,不需要修改原有发送逻辑
方案2:仅通知场景下忽略发送异常(推荐)
如果仅需要通知功能下的短信发送失败不报错,建议自定义Kavenegar通知通道:
- 新建自定义通道文件
app/Notifications/Channels/KavenegarSilentChannel.php
<?php namespace App\Notifications\Channels; use Illuminate\Notifications\Notification; use Kavenegar\Laravel\Channel\KavenegarChannel as BaseChannel; use Kavenegar\Exceptions\ApiException; use Kavenegar\Exceptions\HttpException; class KavenegarSilentChannel extends BaseChannel { public function send($notifiable, Notification $notification) { try { parent::send($notifiable, $notification); } catch (ApiException | HttpException $e) { // 错误可写入日志,不抛出 // \Log::info('通知短信发送失败:' . $e->getMessage()); return; } } }
- 修改通知类的
via方法,替换通道为自定义的静默通道:
public function via($notifiable) { return [\App\Notifications\Channels\KavenegarSilentChannel::class]; }
该方案不会影响其他场景下Kavenegar接口的异常抛出,可控性更高
方案3:手动调用发送时直接捕获异常
如果你是直接调用Kavenegar发送接口,不是通过Laravel通知系统,直接用try-catch包裹发送逻辑即可:
try { $api = new \Kavenegar\KavenegarApi("你的API_KEY"); $api->Send('10004346', '用户手机号', 'welcome to app'); } catch (\Exception $e) { // 所有异常直接忽略,程序继续执行 }
提示:建议不要完全吞掉异常,最好将错误信息写入后台日志,避免后续出现短信功能完全不可用但无法定位原因的问题。
内容的提问来源于stack exchange,提问作者Mojtaba Delshad
相关产品推荐
相关产品推荐

