返回 AiToEarn
ErrorBoundary.tsx
1 import React, { useState, useEffect } from 'react';
2 import styles from './errorBoundary.module.scss';
3 import { Button } from 'antd';
4 import { useNavigate } from 'react-router-dom';
5
6 interface ErrorBoundaryProps {
7 children: React.ReactNode;
8 }
9
10 const ErrorBoundary: React.FC<ErrorBoundaryProps> = ({ children }) => {
11 const [hasError, setHasError] = useState(false);
12 const [errorMsg, setErrorMsg] = useState('');
13 const navigate = useNavigate();
14
15 const handleError = (error: Error) => {
16 setErrorMsg(error.stack || '');
17 setHasError(true);
18 };
19
20 useEffect(() => {
21 const errorListener = (event: ErrorEvent) => {
22 handleError(event.error);
23 };
24
25 window.addEventListener('error', errorListener);
26
27 return () => {
28 window.removeEventListener('error', errorListener);
29 };
30 }, []);
31
32 if (hasError) {
33 // 您可以自定义回退UI
34 return (
35 <div className={styles.errorBoundary}>
36 <code>{errorMsg}</code>
37 <h1>对不起,系统出现了错误</h1>
38 <Button
39 type="primary"
40 onClick={() => {
41 console.log(errorMsg);
42 console.log('错误上报');
43 navigate('/login');
44 }}
45 >
46 上报错误
47 </Button>
48 </div>
49 );
50 }
51
52 return <>{children}</>;
53 };
54
55 export default ErrorBoundary;
56
56 lines Plain Text