我正在Blender Game Engine中创建一款游戏。我编写了一个IRC脚本,可以在OS X和Linux发行版上正常工作。输出类似于:
Logging in...
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
<name> has joined.
Logged in!
然后我可以调用sendmsg()函数将消息发送到IRC频道。
这是我尝试在Windows 7上运行时遇到的错误:
我的python IRC代码: http://pastebin.com/aG6TwTir
忽略“bge”引用。这些变量等都是从游戏引擎中填充的。
在游戏引擎中,我调用login()一次,然后吐出“LOGIN_ERROR”,所以我知道它正在尝试连接,然后它会连接,因此不会抛出异常并结束函数。
在OS X和Linux中,它可以完美无缺地在后台运行,而玩家可以在连接时继续播放。
在Windows 7中,它会抛出该错误。
所以我想需要发生的是一种等待脚本连接到服务器的方法。然后连接后,我可以发送登录信息并加入频道。
那我该如何等待连接?
仅供参考:我的套接字是非阻塞的,因为脚本需要在每个帧上与游戏引擎运行在同一个线程上。 Main()每帧都运行,而不是整个脚本。在菜单中,它执行脚本并调用login()。然后在游戏中,它将每帧调用Main()。 哦,我正在使用Python 3.3。
任何帮助都非常有用! ^ _ ^
编辑: 我该如何处理这个例外?
答案 0 :(得分:1)
此代码:
def login():
...
try:
...
except:
...
login() # <===
递归地调用自己;给定足够多的登录失败,取决于堆栈大小限制(这取决于我猜的平台),您将获得堆栈溢出。
另请参阅:Setting stacksize in a python script
虽然我总是会避免递归并改为使用循环,除非我事先知道递归深度永远不会超过~100:
while True:
try:
do_login()
except: # NOTE: USE A SPECIFIC EXCEPTION CLASS HERE, BTW
continue
else:
break
答案 1 :(得分:0)
您的错误处理中发生了递归
def login():
#print('login')
# Bind the socket
try:
s.connect((HOST, PORT))
# Send login info
s.send(bytes('NICK %s\r\n' % NICK, 'UTF-8'))
s.send(bytes('USER %s %s bla :%s\r\n' % (IDENT, HOST, REALNAME), 'UTF-8'))
s.send(bytes('JOIN %s\r\n' % CHAN, 'UTF-8'));
print('Logging in...')
chatlog('Logging in...')
except:
print('LOGIN_ERROR')
login()
所以在你的函数login()中你有一个尝试,然后在你再次调用login()之外。如果登录失败,这将一遍又一遍地循环。