我已经使用线程编写了程序。这是我编写的代码的示例:
from time import sleep, time
from threading import Thread
def UserInfo():
global gamesummary
Thread(target = CheckTime).start()
gamesummary=open("gamesummary.txt","w+")
AskQuestions()
def CheckTime():
global gamesummary
sleep(5)
print("Time's up!")
gamesummary.close()
raise ValueError
def AskQuestions():
global gamesummary
try:
while True:
input("Program asks questions correctly here: ")
gamesummary.write("Program correctly records information here")
except ValueError:
EndProgram()
def EndProgram():
end=input("Would you like to play again?: ")
if(end.lower()=="yes"):
UserInfo()
elif(end.lower()=="no"):
print("Thank you for playing.")
sleep(1)
raise SystemExit
else:
print("Please enter either 'yes' or 'no'.\n")
EndProgram()
程序中的所有操作均正确完成并可以正常继续,但是此错误在EndProgram()之前显示:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Users\akeri\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\akeri\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "x-wingide-python-shell://105807224/2", line 15, in CheckTime
ValueError
此错误不会阻止程序运行。
我不明白为什么try和except语句未捕获此异常。我认为这是因为我正在创建两个错误?我是使用Python的新手,我非常感谢能从中获得的任何帮助。
答案 0 :(得分:2)
在后台线程中获得ValueError
的原因是,您正在该线程的目标函数中显式引发ValueError
:
def CheckTime():
global gamesummary
sleep(5)
print("Time's up!")
gamesummary.close()
raise ValueError
当后台线程引发异常时,它不会杀死整个程序,而只是将回溯转储到stderr并杀死该线程,而其他线程仍在运行。您在这里看到的是什么。
如果您不想要那样,只需将其保留为空。
如果您希望异常会以某种方式影响主线程,则不会这样做。但是您不需要 来做到这一点。您正在从主线程下关闭文件,这意味着AskQuestions
在尝试ValueError: I/O operation on closed file
到文件时将获得write
异常。您正在正确处理。这有点奇怪,但是可以按预期工作。您不需要在上面添加任何额外的内容。
如果您希望从主线程中捕获异常,那么该异常也不起作用-但同样,它不是必需的。主线程不受后台线程异常的影响。