@flare-engine/误差
反应出出错边界+结构化相撞有效载荷. createCrashPayload(err, context?) 将任何抛出值常态化为稳定值 CrashPayload 形状。 可插件 CrashTransport 汇 : createNoopTransport, (中文(简体) ), createConsoleTransport, (中文(简体) ), createSentryTransport (懒惰装入) @sentry/react-native,可选的对等函数)和 composeTransports 为粉丝出.
安装
bun add @flare-engine/errors
可选的对等分页 : react, (中文(简体) ), @sentry/react-native (只有你给哨兵运输系统电线).
使用量
import { ErrorBoundary, createSentryTransport, createConsoleTransport,
composeTransports, type CrashPayload } from '@flare-engine/errors';
import type { ReactNode } from 'react';
declare function CrashScreen(props: { err: CrashPayload; onRetry: () => void }): ReactNode;
declare function App(): ReactNode;
const transport = composeTransports(
createConsoleTransport(),
createSentryTransport({ dsn: 'https://[email protected]/0', enabled: true }),
);
<ErrorBoundary
fallback={(err, reset) => <CrashScreen err={err} onRetry={reset} />}
transport={transport}
context={{ scene: 'play', level: 4 }}
>
<App />
</ErrorBoundary>
createSentryTransport 启动 SDK 本身的捕获器关闭的哨兵——没有全局错误或
拒绝处理器,没有自动会话跟踪,没有本地崩溃处理,没有控制台/网络
仪器——因此,哨兵只发送所发送的运输物品,并装有同意检查
运输站的前面 整个过程的联署材料错误通过 installGlobalErrorCapture
(下节. 一个例外是运输无法关闭:在Android 11+上
自行通过ANRs;如果同意必须涵盖这些内容,确定 io.sentry.anr.enable 元数据到
false 在你的Android清单中哨兵和机器人文件) (中文(简体) ).
选择放弃融合是一种蓄意行为: integrations 钩子接收
允许列表( e)kept)和SDK自己的默认列表(defaults返回什么 init 用户。 每个
条目为 a SentryIntegrationLike (单位:千美元){ name }因此没有 @sentry/react-native 需要类型.
import { createSentryTransport } from '@flare-engine/errors';
const transport = createSentryTransport({
dsn: 'https://[email protected]/0',
integrations: (kept, defaults) => [
...kept,
...defaults.filter((integration) => integration.name === 'Breadcrumbs'),
],
});
正在返回 defaults,或通过任何捕获集成,例如
ReactNativeErrorHandlers,重新启用 哨兵本身的全球处理器,这些处理器在
运输,所以没有 任何同意检查 在它的前面。 扔出一钩被记录下来
使用许可列表.
在取消同意时,关闭运输。 哨兵运输在等待SDK的 close() 一次
(只有装过子弹),每晚 report() 无发送; 秒 close() 决定
不再关闭. composeTransports 转发 close() 给每个有孩子的孩子,所以
链条从第一个例子关闭在一个调用中:
import { composeTransports, createConsoleTransport, createSentryTransport } from '@flare-engine/errors';
const transport = composeTransports(
createConsoleTransport(),
createSentryTransport({ dsn: 'https://[email protected]/0' }),
);
// later, when the user withdraws consent:
await transport.close?.();
close 可选于 CrashTransport· ; createNoopTransport, (中文(简体) ), createConsoleTransport 编辑
无 DSN 选项 createSentryTransport 返回时未定义.
抓住边界所不能达到的
ErrorBoundary 只在 React 渲染相中看到出错 。 游戏的坠机大多是
不在那里——他们处在更新的循环中,在资产负荷中,在没有人期待的许诺中.
installGlobalErrorCapture 进入同一运输链的路线.
import { installGlobalErrorCapture, createConsoleTransport } from '@flare-engine/errors';
// `globalThis` supplies `addEventListener` on web and `ErrorUtils` on React
// Native, so one call covers both.
const capture = installGlobalErrorCapture(globalThis, {
transport: createConsoleTransport(),
context: { build: '1.2.3' },
});
// Later, e.g. on scene teardown or hot reload:
capture.uninstall();
运输工具可以附加 之后 安装。 二者之间出现的错误在小环中保存 缓冲器(默认为 20,最古老的掉落),并排入了接力上,所以在靴子时发生的相撞事件—— 通常有趣的——不会丢失,而您的记者仍在初始化:
import { installGlobalErrorCapture, createClientTransport } from '@flare-engine/errors';
declare const Sentry: { captureException(error: unknown, hint?: unknown): unknown };
const capture = installGlobalErrorCapture(globalThis); // no transport yet
// ... boot, read config, initialise the reporter ...
capture.setTransport(createClientTransport(Sentry)); // buffered errors drain here
有两件事值得了解:
- 在上一个原生反应
ErrorUtils处理器是 连锁,没有替换 - 那个操作员是 显示开发中的红盒 并结束一个致命的过程, 所以它仍然运行.uninstall()复还之. createSentryTransport纯本地( 它导入)@sentry/react-native) (中文(简体) ).createClientTransport是 web 对应程序: 您打开浏览器客户端并注入它, 所以 此软件包取决于没有自己的记者.
见 API 规格。 。 。 .
许可证
阿帕奇 - 2.0