import { useState } from 'react' import { Link } from 'wouter' interface ErrorScenario { id: string title: string description: string type: 'network' | 'validation' | 'permission' | 'timeout' | 'server' } export default function ErrorTestPage() { const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(null) const [retryCount, setRetryCount] = useState(0) const [formData, setFormData] = useState({ username: '', password: '', email: '', file: null as File | null, }) const errorScenarios: ErrorScenario[] = [ { id: 'network-error', title: '网络连接错误', description: '模拟网络连接失败,测试重试机制', type: 'network', }, { id: 'validation-error', title: '表单验证错误', description: '模拟表单验证失败,测试错误提示', type: 'validation', }, { id: 'permission-error', title: '权限不足错误', description: '模拟权限验证失败,测试权限处理', type: 'permission', }, { id: 'timeout-error', title: '请求超时错误', description: '模拟请求超时,测试超时处理', type: 'timeout', }, { id: 'server-error', title: '服务器内部错误', description: '模拟服务器500错误,测试错误恢复', type: 'server', }, ] const simulateError = async (scenario: ErrorScenario): Promise => { setIsLoading(true) setError(null) setSuccess(null) // 模拟网络延迟 await new Promise((resolve) => setTimeout(resolve, 1000 + Math.random() * 2000)) switch (scenario.type) { case 'network': // 70% 概率失败 if (Math.random() < 0.7) { throw new Error('网络连接失败:无法连接到服务器,请检查您的网络连接') } break case 'validation': // 检查表单数据 if (!formData.username || formData.username.length < 3) { throw new Error('用户名验证失败:用户名至少需要3个字符') } if (!formData.password || formData.password.length < 6) { throw new Error('密码验证失败:密码至少需要6个字符') } if (!formData.email?.includes('@')) { throw new Error('邮箱验证失败:请输入有效的邮箱地址') } break case 'permission': // 模拟权限检查 if (formData.username !== 'admin') { throw new Error('权限不足:您没有执行此操作的权限,请联系管理员') } break case 'timeout': // 模拟超时 await new Promise((resolve) => setTimeout(resolve, 8000)) throw new Error('请求超时:服务器响应时间过长,请稍后重试') case 'server': // 50% 概率服务器错误 if (Math.random() < 0.5) { throw new Error('服务器内部错误:服务器遇到了一个错误,请稍后重试') } break default: throw new Error('未知错误:发生了未预期的错误') } // 成功情况 return Promise.resolve() } const handleScenarioTest = async (scenario: ErrorScenario) => { try { await simulateError(scenario) setSuccess(`${scenario.title} 测试成功完成!`) setRetryCount(0) } catch (err) { const errorMessage = err instanceof Error ? err.message : '未知错误' setError(errorMessage) setRetryCount((prev) => prev + 1) } finally { setIsLoading(false) } } const handleRetry = async (scenario: ErrorScenario) => { if (retryCount >= 3) { setError('重试次数已达上限,请稍后再试或联系技术支持') return } await handleScenarioTest(scenario) } const handleFileUpload = async () => { if (!formData.file) { setError('请选择要上传的文件') return } setIsLoading(true) setError(null) setSuccess(null) try { // 模拟文件大小检查 if (formData.file.size > 5 * 1024 * 1024) { throw new Error('文件上传失败:文件大小不能超过5MB') } // 模拟文件类型检查 const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'] if (!allowedTypes.includes(formData.file.type)) { throw new Error('文件上传失败:不支持的文件类型,请上传图片或PDF文件') } // 模拟上传过程 await new Promise((resolve) => setTimeout(resolve, 2000)) // 模拟随机失败 if (Math.random() < 0.3) { throw new Error('文件上传失败:上传过程中发生错误,请重试') } setSuccess('文件上传成功!') } catch (err) { const errorMessage = err instanceof Error ? err.message : '文件上传失败' setError(errorMessage) } finally { setIsLoading(false) } } const clearMessages = () => { setError(null) setSuccess(null) setRetryCount(0) } const getErrorIcon = (type: string) => { switch (type) { case 'network': return '🌐' case 'validation': return '⚠️' case 'permission': return '🔒' case 'timeout': return '⏰' case 'server': return '🔧' default: return '❌' } } return (

错误处理测试

测试各种错误场景和重试机制,验证 Agent 的错误处理能力

{/* 全局消息显示 */} {(error || success) && (
{error && (

操作失败

{error}

{retryCount > 0 && (

已重试 {retryCount} 次 {retryCount >= 3 && '(已达最大重试次数)'}

)}
)} {success && (

操作成功

{success}

)}
)}
{/* 错误场景测试 */}

错误场景测试

{errorScenarios.map((scenario) => (
{getErrorIcon(scenario.type)}

{scenario.title}

{scenario.description}

{error && retryCount > 0 && retryCount < 3 && ( )}
))}
{/* 表单验证测试 */}

表单验证测试

用户信息表单

setFormData((prev) => ({ ...prev, username: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white" placeholder="请输入用户名" />
setFormData((prev) => ({ ...prev, password: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white" placeholder="请输入密码" />
setFormData((prev) => ({ ...prev, email: e.target.value }))} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white" placeholder="请输入邮箱地址" />
{/* 文件上传测试 */}

文件上传测试

setFormData((prev) => ({ ...prev, file: e.target.files?.[0] || null })) } accept="image/*,.pdf" className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white" />
{formData.file && (
已选择: {formData.file.name} ({(formData.file.size / 1024 / 1024).toFixed(2)}{' '} MB)
)}
{/* 权限测试说明 */}

💡 权限测试提示

要通过权限测试,请在用户名字段输入 "admin",然后点击"触发错误"按钮测试权限验证。

{/* 加载状态指示器 */} {isLoading && (
处理中,请稍候...
)} {/* 返回链接 */}
← 返回测试页面列表
) }