Я написал программу, используя поток. Вот пример кода, который я написал:
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 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, и я очень благодарен за любую помощь, которую я смогу с этим справиться.
Причина, по которой вы получаете ValueError
в фоновом потоке, заключается в том, что вы явно повышаете ValueError
в целевой функции для этого потока:
def CheckTime():
global gamesummary
sleep(5)
print("Time up!")
gamesummary.close()
raise ValueError
Когда фоновый поток вызывает исключение, вместо того, чтобы убивать всю программу, он просто сбрасывает трассировку на stderr и убивает поток, оставляя остальные потоки. Это то, что вы видите здесь.
Если вы этого не хотите, просто оставьте эту строку выключенной.
Если бы вы надеялись, что исключение каким-то образом повлияет на основной поток, это не будет сделано. Но вам это не нужно. Вы закрываете файл из-под основного потока, что означает, что AskQuestions
собирается получить ValueError: I/O operation on closed file
исключении ValueError: I/O operation on closed file
когда он пытается write
в файл. Который вы правильно обрабатываете. Это немного странный дизайн, но он будет работать по назначению; вам не нужно добавлять что-либо лишнее поверх него.
Если бы вы надеялись поймать исключение из основного потока, это тоже не сработает - но опять же, это не нужно. Исключением фонового потока не влияет основной поток.