@ 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 通过确保:
- 控制出错流量:所有出错在撞击出错跟踪系统之前,都会经过一个经过了良好测试的单一消毒层.
- 可强制执行的安全:错误处理可以通过代码拥有者来拥有,并被测试所覆盖,所以不会漏出任何不被注意.
除了强制执行这些做法外, SafeError 包括一些关键的设计决定,使其比原生错误对象更加安全可靠:
- 信件卫生编号:
message来自内建错误的属性被故意省略,因为它常常包含敏感信息。 相反,ahint属性仅包含已消毒的非敏感信息. - 本地堆栈解析: 图书馆使用
Error.prepareStackTraceAPI 密码 来解析堆栈跟踪,提供跨越不同JavaScript环境的一致而可靠的堆栈跟踪信息. - 可变性: 一旦创建, a
SafeError实例不能被修改,防止篡改错误数据. - 安全序列化编号:
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.
}