@exodus/errors

中文文档
3.8.2发布于 2026/10/14MITTypeScriptES Module近 30 天下载 1.2万

用于客户端代码中错误处理的软件,例如消毒

中文使用文档
文档目录9 节
  1. 使用量
  2. 财务问题
  3. 为什么使用 SafeError 而不是内置错误 ?
  4. 为什么不编辑错误消息 ?
  5. 为什么不使用内置 .stack 错误属性 ?
  6. 食谱
  7. 我想保存安全错误中的服务器错误
  8. 解决问题
  9. 安全错误实例返回 undefined 堆积追踪?

@ exodus/ errors

使用量

import { SafeError } from '@exodus/errors'

try {
  throw new Error('Something went wrong')
} catch (e) {
  const safeError = SafeError.from(e)

  // It's now safe to report or log the error, even to a remote server.
  console.error({
    name: safeError.name, // Sanitized error name.
    code: safeError.code, // Optional error code (if present).
    hint: safeError.hint, // Optional error hint (if present).
    stack: safeError.stack, // Sanitized stack trace.
    timestamp: safeError.timestamp, // When the error occurred.
  })
}

财务问题

为什么使用 SafeError 而不是内置错误 ?

在大型代码库中,错误可以从任何地方抛出,因此不可能对每一个错误消息进行敏感信息的审计. 包含敏感数据的单一错误可能暴露用户信息。 集中处理错误 SafeError 通过确保:

  1. 控制出错流量:所有出错在撞击出错跟踪系统之前,都会经过一个经过了良好测试的单一消毒层.
  2. 可强制执行的安全:错误处理可以通过代码拥有者来拥有,并被测试所覆盖,所以不会漏出任何不被注意.

除了强制执行这些做法外, SafeError 包括一些关键的设计决定,使其比原生错误对象更加安全可靠:

  1. 信件卫生编号: message 来自内建错误的属性被故意省略,因为它常常包含敏感信息。 相反,a hint 属性仅包含已消毒的非敏感信息.
  2. 本地堆栈解析: 图书馆使用 Error.prepareStackTrace API 密码 来解析堆栈跟踪,提供跨越不同JavaScript环境的一致而可靠的堆栈跟踪信息.
  3. 可变性: 一旦创建, a SafeError 实例不能被修改,防止篡改错误数据.
  4. 安全序列化编号: toJSON 方法确保记录或发送到错误跟踪服务的安全序列化.

为什么不编辑错误消息 ?

对错误信息进行解析/保密是不可靠的,失败的代价是潜在的用户资金损失和永久声誉损害.

为什么不使用内置 .stack 错误属性 ?

不幸的是,内在的 .stack 财产是可变异的,而且不受我们的控制。 相反,我们使用 Error.prepareStackTrace API,它使我们能够确保我们访问实际的呼叫堆栈而不是缓存 err.stack 可能已经消耗和修改的数值。 然后我们把它分析成一种结构化的格式, 我们可以安全地消毒和控制。 这种方法在不同的环境中(目前支持V8和Hermes)提供了一致,可靠的堆栈痕迹.

食谱

[TIP] 在潜入食谱之前,你可能想要熟悉什么是"安全弦": https://github.com/Exodus Movement/exodus-hydra/tree/master/librarys/saf-string 互联网档案馆的存檔,存档日期2013-12-21

我想保存安全错误中的服务器错误

你控制服务器吗? 如果是的话, 最好从您的服务器发送短错误代码 . err.code 将 将经过 安全错误胁迫.

如果您不控制服务器, 并且您知道服务器返回的具体错误消息, 您可以预先定义它们 safeString数字 :

import { safeString } from '@exodus/safe-string'

// From: https://github.com/ethereum/go-ethereum/blob/master/core/txpool/errors.go.
export const KnownErrors = new Set([
  safeString`already known`,
  safeString`invalid sender`,
  safeString`transaction underpriced`,
])

您现在可以处理这样的失败请求 :

import { safeString } from '@exodus/safe-string`
import { KnownErrors } from './errors.js'

const response = await this.request(request)
const error = response?.error

if (error) {
  const message = KnownErrors.get(msg) ?? safeString`unknown error`
  throw new Error(safeString`Bad rpc response: ${message}`)
}

解决问题

安全错误实例返回 undefined 堆积追踪?

可能意味着有东西进入 error.stack 在此之前 安全错误构建器有机会应用自定义 Error.prepareStackTrace 处理者。 这可能是反应,高级错误处理器,或任何其他框架. error.stack 仅在第一次访问时计算,所以不会要求自定义处理器进行后续尝试(参见 stack.test.js 快速演示.

如果你能确定具体地点 .stack 已访问, 考虑像这样捕捉堆栈跟踪 :

import { captureStackTrace, SafeError } from '@exodus/errors'

try {
  // the devil's work
} catch (e) {
  captureStackTrace(e)
  void e.stack // Intentionally access the property to "break" it here.
  SafeError.from(e).stack // A non-empty string!
  // 🎉 Congrats — you just (hopefully) saved hours of debugging! The custom stack trace parsing logic now works because the stack was captured explicitly above.
}

版本与发布记录

@exodus/errors 共发布 25 个版本,首次发布于 2024/07/17;过去 12 个月发布了 6 个版本。

版本发布日期距今
3.8.2latest2026/10/141 个月前
3.8.12026/05/066 个月前
3.8.02026/02/248 个月前
3.7.12026/02/198 个月前
3.7.02026/02/139 个月前
3.6.02026/02/039 个月前

关于 @exodus/errors 的常见问题

@exodus/errors 是什么?

用于客户端代码中错误处理的软件,例如消毒

如何安装 @exodus/errors?

在项目目录运行 npm install @exodus/errors,或使用 pnpm add / yarn add / bun add。

@exodus/errors 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@exodus/errors 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@exodus/errors 可以商用吗?

@exodus/errors 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@exodus/errors 的下载量有多少?

根据 npm 官方下载统计,@exodus/errors 在 2026/10/14 – 2026/11/12 这 30 天内被下载 11,668 次,日均约 389 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@exodus/errors 还在维护吗?

最新版本 3.8.2 发布于 2026/10/14(1 个月前);至今共发布 25 个版本,其中过去 12 个月发布了 6 个;首次发布于 2024/07/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。