2011-01-12 3 views
0

I가 서로 다른 패턴 RuntimeError에는 : 최대 재귀 수준을 초과

def urlChange(self, event): 
    text = self.txtUrl.GetValue() 
    matches = re.findall('GET (\S+).*Host: (\S+).*Cookie: (.+\S)\s*', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    groups = matches[0] 
    self.txtUrl.SetValue(groups[1] + groups[0]) 
    self.txtCookie.SetValue(groups[2]) 
    else: 
    matches = re.findall('GET (\S+).*Host: (\S+).*', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    groups = matches[0] 
    self.txtUrl.SetValue(groups[1] + groups[0]) 
    self.txtCookie.Clear() 
    else: 
    matches = re.findall('.*(http://\S+)', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    self.txtUrl.SetValue(matches[0]) 
    matches = re.findall('.*Cookie: (.+\S)', text, re.DOTALL or re.MULTILINE) 
    if matches: 
     self.txtCookie.SetValue(matches[0]) 

를 일치시켜 텍스트에서 두 문자열을 추출 다음 코드 만 마지막 re.findall('.*(http://\S+)'... 문이 실행 나는 다음과 같은 오류 메시지가 도착할 때 :

Traceback (most recent call last): 
    File "./curl-gui.py", line 105, in urlChange 
    text = self.txtUrl.GetValue() 
RuntimeError: maximum recursion depth exceeded 
Error in sys.excepthook: 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 48, in apport_excepthook 
    if not enabled(): 
    File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 21, in enabled 
    import re 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

Original exception was: 
Traceback (most recent call last): 
    File "./curl-gui.py", line 105, in urlChange 
    text = self.txtUrl.GetValue() 
RuntimeError: maximum recursion depth exceeded 
+4

아무 것도 모르지만 문제가 'self.txtUrl.GetValue()'줄처럼 보입니다. 'GetValue'는 무엇을합니까? – Kobi

답변

2

GUI 코드와 비슷합니까?

self.txtUrl이 변경 될 때마다 urlChange이 호출된다고 가정합니다. 따라서 self.txtUrl.SetValue(matches[0])에 전화하면 urlChange으로 또 다른 호출이 실행되고, 재귀 한계가 반복되고 htis됩니다.

확실한 추측을 위해서는 더 많은 컨텍스트가 필요 하겠지만, 그 코드에서 볼 수있는 재귀 적 동작은 가능합니다.

이 문제를 해결하려면 textUrl의 값을 확인하여 변경 사항이 있는지 확인한 다음 SetValue을 호출해야 재귀를 방지 할 수 있습니다.

+0

나는 그것을 테스트했다. 이벤트 핸들러 내에서 텍스트를 수정하는 데 아무런 문제가 없으며 무한 재귀를 트리거하지 않는다. 그러나 문제를 재현 할 수 없습니다. 이것은 아마도 입력 텍스트 자체와 관련이 있습니다. – jackhab

+0

텍스트 필드의 값을 일치시킨 다음 다른 값으로 바꾸면 어떤 값으로 어떤 이상한 동작이 나타날 수있는 것처럼 보입니다. 그러나 어떤 값으로 트리거 할지를 정확히 알기는 어렵습니다. –

1

sys.setrecursionlimit()을 사용하여 recrsion 한계를 높이려고 했습니까? 기본적으로 1000으로 설정되어 있습니다.

+1

잘 찍힌다. 그러나 구현 정보가 알려지지 않은 메서드는 사용자가 모르는 재귀를 가질 수 있습니다. 재귀 제한을 조금 올리면 질문을 결정할 수 있습니다. 재귀 한계를 불필요하게 재설정하는 것을 싫어할 것입니다. – ncmathsadist

관련 문제