温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!
HarmonyOS NEXT系列教程之列表交换组件错误处理机制
效果演示
1. 错误处理架构
1.1 错误类型定义
// 错误类型枚举
enum ErrorType {
DATA_ERROR, // 数据错误
OPERATION_ERROR, // 操作错误
NETWORK_ERROR, // 网络错误
UI_ERROR, // UI错误
SYSTEM_ERROR // 系统错误
}
// 自定义错误类
class ListExchangeError extends Error {
constructor(
public type: ErrorType,
public message: string,
public details?: any
) {
super(message);
this.name = 'ListExchangeError';
}
}
1.2 错误处理中心
class ErrorCenter {
private static instance: ErrorCenter;
private handlers: Map<ErrorType, ErrorHandler[]> = new Map();
static getInstance(): ErrorCenter {
if (!this.instance) {
this.instance = new ErrorCenter();
}
return this.instance;
}
// 注册错误处理器
registerHandler(type: ErrorType, handler: ErrorHandler): void {
if (!this.handlers.has(type)) {
this.handlers.set(type, []);
}
this.handlers.get(type).push(handler);
}
// 处理错误
handleError(error: ListExchangeError): void {
const handlers = this.handlers.get(error.type) || [];
handlers.forEach(handler => {
try {
handler(error);
} catch (e) {
console.error('Error handler failed:', e);
}
});
}
}
2. 异常捕获机制
2.1 全局异常捕获
class GlobalErrorHandler {
// 设置全局错误处理
static setup(): void {
globalThis.onerror = (message, source, line, column, error) => {
this.handleGlobalError(error);
return true;
};
globalThis.onunhandledrejection = (event) => {
this.handleUnhandledRejection(event.reason);
return true;
};
}
// 处理全局错误
private static handleGlobalError(error: Error): void {
ErrorCenter.getInstance().handleError(
new ListExchangeError(
ErrorType.SYSTEM_ERROR,
error.message,
error
)
);
}
}
2.2 组件级异常处理
@Component
struct SafeComponent {
@State hasError: boolean = false;
@State errorInfo: string = '';
// 错误边界
onError(error: Error): void {
this.hasError = true;
this.errorInfo = error.message;
ErrorCenter.getInstance().handleError(
new ListExchangeError(
ErrorType.UI_ERROR,
error.message,
error
)
);
}
build() {
if (this.hasError) {
this.renderErrorUI()
} else {
this.renderContent()
}
}
}
3. 错误恢复策略
3.1 状态恢复
class StateRecovery {
private static stateHistory: Array<any> = [];
private static readonly MAX_HISTORY = 10;
// 保存状态
static saveState(state: any): void {
this.stateHistory.push(JSON.parse(JSON.stringify(state)));
if (this.stateHistory.length > this.MAX_HISTORY) {
this.stateHistory.shift();
}
}
// 恢复状态
static restoreState(): any {
return this.stateHistory.pop();
}
// 恢复到最后一个有效状态
static async recoverToLastValidState(): Promise<void> {
while (this.stateHistory.length > 0) {
const state = this.restoreState();
if (await this.validateState(state)) {
return state;
}
}
throw new Error('No valid state found');
}
}
3.2 数据恢复
class DataRecovery {
// 数据备份
static async backupData(data: any): Promise<void> {
try {
await localStorage.setItem(
'data_backup',
JSON.stringify(data)
);
} catch (error) {
console.error('Backup failed:', error);
}
}
// 恢复数据
static async recoverData(): Promise<any> {
try {
const backup = await localStorage.getItem('data_backup');
return JSON.parse(backup);
} catch (error) {
console.error('Recovery failed:', error);
return null;
}
}
}
4. 错误日志系统
4.1 日志记录
class Logger {
private static readonly LOG_LEVELS = {
DEBUG: 0,
INFO: 1,
WARN: 2,
ERROR: 3
};
// 记录错误日志
static logError(error: ListExchangeError): void {
const logEntry = {
timestamp: new Date().toISOString(),
type: error.type,
message: error.message,
details: error.details,
stack: error.stack
};
// 保存日志
this.saveLog(logEntry);
// 发送到服务器
this.sendToServer(logEntry);
}
// 保存日志
private static async saveLog(entry: any): Promise<void> {
const logs = await this.getLogs();
logs.push(entry);
await localStorage.setItem('error_logs', JSON.stringify(logs));
}
}
4.2 日志分析
class LogAnalyzer {
// 分析错误模式
static analyzeErrorPatterns(logs: any[]): ErrorPattern[] {
const patterns: Map<string, number> = new Map();
logs.forEach(log => {
const key = `${log.type}:${log.message}`;
patterns.set(key, (patterns.get(key) || 0) + 1);
});
return Array.from(patterns.entries())
.map(([key, count]) => ({
pattern: key,
frequency: count,
severity: this.calculateSeverity(count)
}));
}
// 生成分析报告
static generateReport(patterns: ErrorPattern[]): string {
return patterns
.sort((a, b) => b.frequency - a.frequency)
.map(p => `${p.pattern}: ${p.frequency} times (${p.severity})`)
.join('\n');
}
}
5. 用户反馈机制
5.1 错误提示
class ErrorNotifier {
// 显示错误提示
static showErrorToast(error: ListExchangeError): void {
promptAction.showToast({
message: this.formatErrorMessage(error),
duration: 3000,
bottom: true
});
}
// 显示错误对话框
static showErrorDialog(error: ListExchangeError): void {
AlertDialog.show({
title: '错误提示',
message: this.formatErrorMessage(error),
primaryButton: {
value: '重试',
action: () => this.retryOperation(error)
},
secondaryButton: {
value: '取消',
action: () => {}
}
});
}
}
5.2 错误反馈
class FeedbackCollector {
// 收集用户反馈
static collectFeedback(error: ListExchangeError): void {
Dialog.show({
title: '问题反馈',
message: '请描述您遇到的问题',
buttons: [
{
text: '提交',
onClick: async (feedback: string) => {
await this.submitFeedback({
error,
feedback,
timestamp: Date.now()
});
}
}
]
});
}
}
6. 调试支持
6.1 调试工具
class DebugTool {
private static isDebugMode: boolean = false;
// 启用调试模式
static enableDebugMode(): void {
this.isDebugMode = true;
this.setupDebugListeners();
}
// 设置调试监听器
private static setupDebugListeners(): void {
if (this.isDebugMode) {
// 监听状态变化
this.watchStateChanges();
// 监听错误发生
this.watchErrors();
// 监听性能指标
this.watchPerformance();
}
}
}
6.2 调试信息
class DebugInfo {
// 收集调试信息
static collectDebugInfo(): DebugReport {
return {
timestamp: Date.now(),
state: this.getCurrentState(),
errors: this.getRecentErrors(),
performance: this.getPerformanceMetrics()
};
}
// 导出调试报告
static exportDebugReport(): void {
const report = this.collectDebugInfo();
const blob = new Blob(
[JSON.stringify(report, null, 2)],
{ type: 'application/json' }
);
// 导出文件逻辑
}
}
7. 最佳实践
7.1 错误处理建议
- 实现完整的错误处理链
- 提供友好的用户反馈
- 保持详细的错误日志
- 实现可靠的恢复机制
7.2 开发建议
- 预防性错误处理
- 合理使用错误边界
- 实现错误监控
- 提供调试支持
8. 小结
本篇教程详细介绍了:
- 错误处理的架构设计
- 异常捕获的实现方法
- 错误恢复的策略
- 日志系统的建立
- 调试支持的实现
下一篇将介绍工具类设计的实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。