跳转到内容

错误处理

Statocysts 将通知目标设置错误与异步投递失败分开处理。

以下情况会让 createNotifier() 同步抛出错误:

  • 通知目标列表为空;
  • 通知目标不是字符串或合法 URL;
  • 标准化后的通知目标重复;
  • 通知目标使用不受支持的协议;
  • 通知目标缺少提供方要求的凭据或路径段,或者包含不支持的查询值。
import { createNotifier } from 'statocysts'
try {
const notifier = createNotifier(['unsupported://recipient'])
await notifier.send({ title: 'Test' })
}
catch (error) {
console.error(error)
}

提供方专属目标校验是同步且仅在本地执行的。创建通知器不会构造传输 payload、获取远程令牌、生成发送时签名或访问通知提供方。这些设置错误会直接抛出,而不会包装成 NotificationDeliveryError。CLI 的 verify 命令采用相同边界。

目标校验成功后,如果一个或多个投递在请求准备或传输阶段失败,顶层 send() 和通知器的 .send() 会抛出 NotificationDeliveryError

import { NotificationDeliveryError, send } from 'statocysts'
try {
await send(process.env.NOTIFICATION_TARGET!, {
title: 'Backup failed',
})
}
catch (error) {
if (!(error instanceof NotificationDeliveryError)) {
throw error
}
console.error({
successCount: error.successCount,
failureCount: error.failureCount,
failures: error.failures,
})
}

每个失败项都包含标准化后的通知目标和原始 cause。通知目标可能包含凭据,请不要将其完整写入日志。

具名通知提供方不会使用通知运行时的批量错误包装:

import { logger } from 'statocysts'
await logger.send('logger://?level=verbose', { title: 'Test' })

此调用会直接抛出日志提供方的查询参数校验错误。当你需要提供方专属的恢复逻辑时使用直接调用;需要所有目标共享统一失败模型时使用通知运行时。