You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

经典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;
};

关键说明

  1. 错误缓存:用变量暂存错误参数,确保延迟检查时能获取完整的错误信息。
  2. 针对性检查:根据错误来源(source字段)判断是资源加载错误还是脚本运行时错误,对应不同的验证逻辑——比如资源加载错误就检查目标资源是否已加载完成,脚本错误可结合业务功能是否正常来判断。
  3. 避免误触发:只有确认错误未恢复时才调用handleErr,过滤掉网络延迟导致的临时错误。

内容的提问来源于stack exchange,提问作者RDesai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:56:52