设计思路
- 全局错误捕获:利用 Svelte 的
error
事件来捕获未处理的错误。这一事件会在组件树的任何地方抛出未捕获的错误时触发。
- 异步操作封装:对于异步操作,使用
try...catch
块来捕获错误,确保异步操作中的错误能够被及时捕获。
- 错误传递:对于无法在当前组件处理的错误,通过事件系统将错误向上传递给父组件,直到全局错误捕获机制能够处理。
- 用户反馈:在捕获到错误后,根据错误类型,向用户提供友好的反馈信息,例如弹出提示框或显示错误页面。
关键代码片段
- 全局错误捕获:
在
main.js
中设置全局错误捕获:
import { error } from'svelte';
error(({ message, error: err }) => {
// 在这里处理全局错误,例如记录日志,向用户显示通用错误信息
console.error('全局捕获到错误:', message, err);
// 例如,显示一个全局的错误提示框
alert('发生了一个错误,请稍后重试。');
});
- 组件内异步操作错误处理:
假设我们有一个组件
AsyncComponent.svelte
,在组件内进行异步操作:
<script>
async function asyncFunction() {
try {
// 模拟异步操作,例如从 API 获取数据
const response = await fetch('https://example.com/api/data');
if (!response.ok) {
throw new Error('网络请求失败');
}
const data = await response.json();
console.log('数据获取成功:', data);
} catch (error) {
// 在这里可以选择处理错误,或者将错误向上传递
console.error('组件内捕获到错误:', error);
// 通过自定义事件将错误传递给父组件
const customEvent = new CustomEvent('component-error', { detail: error });
document.dispatchEvent(customEvent);
}
}
</script>
<button on:click={asyncFunction}>触发异步操作</button>
- 父组件捕获传递的错误:
在父组件
ParentComponent.svelte
中捕获子组件传递的错误:
<script>
document.addEventListener('component-error', (event) => {
const error = event.detail;
console.error('父组件捕获到子组件传递的错误:', error);
// 可以在这里再次处理错误,例如显示更详细的错误信息
alert('子组件发生错误:'+ error.message);
});
</script>
<AsyncComponent />