2017-12-16 5 views
0

ich diese Funktion in einem CFC vor kurzem erstellt, die in den Anwendungsbereich instanziiert wird:unecht, intermittierende, variable undefiniert Fehler

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

Es wird hunderte oder tausende Male pro Stunde, manchmal Dutzende Male in der gleiche Anfrage, aber alle paar Stunden oder so wirft es einen Fehler (immer an der im obigen Code markierten Zeile): Variable RESULTS ist undefined

Ich kann kein Muster erkennen für wann, wie oder warum es geworfen wird . Die gleichen Eingaben, die verwendet werden, wenn der Fehler auftritt, werden Sekunden später funktionieren. Hauptsächlich kann ich nicht sehen, wie es überhaupt jemals geworfen werden sollte.

Ich dachte, es könnte möglich sein, dass die aufgerufene Funktion (real_url_for) einen undefinierten Wert zurückgibt, aber es hat die gleiche var results='';, und diese Variable ist, was es zu dieser Funktion zurückgibt.

Ich weiß nicht, ob dies relevant ist, aber die Datei application.cfm definiert eine Wrapper-Funktion app_url_for(), die einfach den Wert dieser Funktion aufruft und zurückgibt. Dies ist zu vermeiden, Application.URLManager.url_for() überall zu referenzieren.

Das hat mich ratlos. Ich vermute, ich könnte nach der Existenz der Variablen suchen, aber das sollte nicht nötig sein. Hier

ist die real_url_for Funktion:

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

Ich werde versuchen, var key=''; auf beiden Funktionen hinzufügen und sehen, ob das hilft.

+0

Klingt nach Rennbedingungen aufgrund variabler Leckage. Den Code überspringend sehe ich mindestens eine Variable, die nicht var ist: 'key'. Überprüfen Sie zuerst die aufgerufenen Funktionen und überprüfen Sie, ob alle lokalen Variablen der Funktion lokalisiert sind. – Ageax

+0

Können Sie uns den Code in 'real_url_for' zeigen? Variablenverlust (zumindest in "url_for") erklärt das Problem nicht, aber @Ageax hat immer noch Recht. – Alex

+0

https://StackOverflow.com/questions/34164252/losing-Variable-Element-is-undefined-in-Variables –

Antwort

1

Klingt nach Rennbedingungen aufgrund variabler Leckage. Den Code überspringend sehe ich mindestens eine Variable, die nicht var ist: key. Da die Komponente im Bereich application gespeichert ist, können mehrere Threads die Variable gleichzeitig lesen/schreiben, was zu Fehlern oder seltsamen Ergebnissen führt.

Zuerst die aufgerufene (n) Funktion (en) prüfen. Überprüfen Sie, ob alle lokalen Variablen der Funktion ordnungsgemäß lokalisiert sind.

1

Die key Variable als lokal für jede Funktion zu deklarieren scheint das Problem zu beheben. Es hat seit über vier Tagen nicht wiedergekehrt. Danke an alle, die Feedback gegeben haben.

+1

Variable Leckage kann sehr schwierig zu beheben sein, besonders wenn Sie nicht der ursprüngliche Autor des Codes sind. Aus diesem Grund ist gutes Scoping wichtig. Ich bin froh, dass Sie es behoben haben. – Shawn

Verwandte Themen