首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚假的、间歇的、可变的、未定义的误差

虚假的、间歇的、可变的、未定义的误差
EN

Stack Overflow用户
提问于 2017-12-16 03:39:05
回答 2查看 155关注 0票数 0

我最近在一个CFC中创建了这个函数,它被实例化到应用程序范围中:

代码语言:javascript
复制
Public String function url_for(path='') {
    var results = '';
    var these_parms = '';
    var parm_delim = '?';
    for (key in Arguments) {
        if (len(Arguments[key])) {
            switch(key) {
                case "path":
                    results = '#arguments[key]#';
                    break;
                case "template":
                    results = '/cf/#arguments[key]#';
                    break;
                case "productid":
                    if (NOT comparenocase(left(arguments[key],2),'p_'))
                        results = real_url_for(partno=replace(arguments[key],'p_',''));
                    else
                        results = real_url_for(productid=arguments[key]);
                    break;
                case "categoryid":
                    results = real_url_for(categoryid=arguments[key]);
                    break;
                case "specialid":
                    results = real_url_for(specialid=arguments[key]);
                    break;
                case "partno":
                    if (NOT len(arguments['path']))
                        results = real_url_for(partno=arguments[key]);
                    else
                        these_parms = listappend(these_parms,'#key#=#urlencodedformat(arguments[key])#','&');
                    break;
                case "parms":
                    these_parms = listappend(these_parms,'#arguments[key]#','&');
                    break;
                default:
                    these_parms = listappend(these_parms,'#key#=#urlencodedformat(arguments[key])#','&');
                    break;
            }
        }
    }
    if (len(results)) { //*********** error always occurs here 
        for (var i=1;i LTE variables.rewritequery.recordcount;i=i+1) {
            if (NOT comparenocase(variables.rewritequery.internalurl[i], results)) {
                results = variables.rewritequery.externalurl[i];
                break;
            }
        }
    }
    if (len(results) AND len(these_parms)) {
        if (listlen(results,'?') GT 1)
            parm_delim = '&';
        results = listappend(results, these_parms, parm_delim);
    }
    return results;
}

它每小时运行数百次或数千次,有时在同一个请求中运行数十次,但大约每隔几个小时就会抛出一个错误(始终位于上面代码中标记的行):变量结果是未定义的

我无法检测到何时、如何或为什么抛出它的模式。错误发生时使用的相同输入在几秒钟后也会正常工作。主要是,我看不出它应该如何被扔在第一位。

我认为调用的函数(real_url_for)可能正在返回一个未定义的值,但是它有相同的var results='';,而这个变量就是它返回给这个函数的内容。

不知道这是否相关,但是application.cfm文件定义了一个包装函数app_url_for(),它只是调用和返回这个函数的值。这是为了避免在各地引用Application.URLManager.url_for()

这让我很困惑。我想我可以检查变量的存在,但是不需要这样做。

下面是real_url_for函数:

代码语言:javascript
复制
Private String function real_url_for() {
    var results = '';
    for (key in Arguments) {
        if (len(Arguments[key])) {
            switch(key) {
                case "productid":
                    results = '/cf/displaylearnmore.cfm?#key#=#arguments[key]#';
                    break;
                case "categoryid":
                    results = '/cf/learnmorelist.cfm?#key#=#arguments[key]#';
                    break;
                case "specialid":
                    results = '/cf/displayspecial.cfm?#key#=#arguments[key]#';
                    break;
                case "partno":
                    results = '/part/#arguments[key]#';
                    break;
            }
        }
    }
    return results;
}

我将尝试将var key='';添加到这两个函数中,看看这是否有帮助。

EN

回答 2

Stack Overflow用户

发布于 2017-12-22 19:51:18

听起来像是因为可变泄漏而导致的种族状况。在我看到的代码中,至少有一个变量不是var作用域:key。由于组件存储在application作用域中,多个线程很容易同时读取/写入该变量,从而导致错误或奇怪的结果。

首先检查调用的函数。验证所有函数局部变量是否正确本地化。

票数 1
EN

Stack Overflow用户

发布于 2017-12-24 01:16:23

key变量声明为每个函数的本地变量似乎解决了这个问题。它已经四天没有复发了。感谢所有提供反馈的人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47842302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档