经典ASP应用中如何为Window.onerror添加延迟检查逻辑?
解决经典ASP中Window.onerror触发过早的问题
问题分析
你之前直接将setTimeout(handleErr, 5000)赋值给window.onerror的方式是错误的——window.onerror需要绑定的是一个能接收错误参数的函数,而setTimeout返回的是定时器ID,这种写法会导致页面加载时就启动定时器,而非错误发生时触发延迟检查。
解决方案
我们需要通过中间函数捕获错误、缓存错误信息,延迟5秒后检查错误是否仍存在,再决定是否调用handleErr。以下是具体实现:
基础兼容版(支持老浏览器)
var cachedError = null; window.onerror = function(message, source, lineno, colno, error) { // 缓存错误详情 cachedError = { message: message, source: source, lineno: lineno, colno: colno, error: error }; // 启动5秒后的检查定时器 setTimeout(function() { var errorStillExists = false; // 根据错误类型做针对性检查(示例:资源加载错误检查) if (source) { // 检查是否是脚本资源加载失败 var targetScripts = document.querySelectorAll('script[src="' + source + '"]'); if (targetScripts.length > 0) { // 脚本未加载完成则判定错误仍存在 errorStillExists = targetScripts[0].readyState !== 'complete' && targetScripts[0].readyState !== 'loaded'; } else { // 检查是否是样式资源加载失败 var targetLinks = document.querySelectorAll('link[href="' + source + '"]'); if (targetLinks.length > 0) { // 样式表无法访问则判定错误仍存在 errorStillExists = !targetLinks[0].sheet; } } } else { // 针对脚本运行时错误:可根据业务逻辑调整检查规则,默认判定错误存在 errorStillExists = true; } // 确认错误仍存在时,调用handleErr if (errorStillExists && cachedError) { handleErr( cachedError.message, cachedError.source, cachedError.lineno, cachedError.colno, cachedError.error ); } // 清空缓存的错误信息 cachedError = null; }, 5000); // 返回true阻止浏览器默认错误提示(按需调整) return true; };
关键说明
- 错误缓存:用变量暂存错误参数,确保延迟检查时能获取完整的错误信息。
- 针对性检查:根据错误来源(
source字段)判断是资源加载错误还是脚本运行时错误,对应不同的验证逻辑——比如资源加载错误就检查目标资源是否已加载完成,脚本错误可结合业务功能是否正常来判断。 - 避免误触发:只有确认错误未恢复时才调用
handleErr,过滤掉网络延迟导致的临时错误。
内容的提问来源于stack exchange,提问作者RDesai
相关产品推荐
相关产品推荐

