本文介绍在 laravel 中使用通知(notification)批量发送邮件时,如何通过 try-catch 捕获异常,避免单个邮件失败导致整个 foreach 循环中断,确保其余用户仍能正常接收邮件。
在 Laravel 应用中,常需向多个用户批量发送欢迎邮件(如注册后触发 MailBienvenida 通知)。但默认情况下,若某位用户的邮箱格式错误、SMTP 连接超时或模板渲染异常,$user->notify(new MailBienvenida($name, $code)) 将抛出 Throwable(包括 Exception 和 PHP 7+ 的 Error),导致整个 foreach 循环立即终止,后续用户无法收到通知。
✅ 正确做法是:在循环内对每次通知发送进行独立异常捕获,利用 PHP 7+ 统一的 Throwable 接口实现“失败不中断、日志可追溯、流程可持续”。
以下为推荐实践代码:
use Illuminate\Support\Facades\Log;
foreach ($users as $user) {
try {
$user->notify(new MailBienvenida($user->name, $user->activation_code));
Log::info("Welcome email sent successfully to {$user->email}");
} catch (\Throwable $e) {
// 记录具体错误(含用户标识),便于排查
Log::error("Failed to send welcome email to {$user->email}: " . $e->getMessage(), [
'user_id' => $user->id,
'exception' => get_class($e),
'trace' => $e->getTraceAsString(),
]);
// continue 自动进入下一次迭代,不影响其他用
户
continue;
}
}? 关键要点说明:
? 总结:批量通知场景下,“防御性编程”不是过度设计,而是生产环境的必备实践。用好 try-catch(\Throwable) + 结构化日志,即可在保证系统韧性的同时,维持业务逻辑的完整性与可维护性。