// src/hooks/useGlobalErrorHandler.js
// 全局错误处理 Hook
import { useEffect } from 'react';
import { logger } from '../utils/logger';
/**
* 全局错误处理 Hook
* 捕获未处理的 Promise rejection 和全局错误
*
* @example
* function App() {
* useGlobalErrorHandler();
* return
...
;
* }
*/
export function useGlobalErrorHandler() {
useEffect(() => {
/**
* 处理未捕获的 Promise rejection
*/
const handleUnhandledRejection = (event) => {
logger.error(
'App',
'unhandledRejection',
event.reason instanceof Error ? event.reason : new Error(String(event.reason)),
{ promise: event.promise }
);
// 阻止默认的错误处理(防止崩溃)
event.preventDefault();
};
/**
* 处理全局错误
*/
const handleError = (event) => {
logger.error(
'App',
'globalError',
event.error || new Error(event.message),
{
filename: event.filename,
lineno: event.lineno,
colno: event.colno
}
);
// 阻止默认的错误处理(防止崩溃)
event.preventDefault();
};
// 注册事件监听器
window.addEventListener('unhandledrejection', handleUnhandledRejection);
window.addEventListener('error', handleError);
// 清理函数
return () => {
window.removeEventListener('unhandledrejection', handleUnhandledRejection);
window.removeEventListener('error', handleError);
};
}, []);
}