gpt4 book ai didi

python - try 和 except 以及线程错误

转载 作者:行者123 更新时间:2023-12-01 01:48:55 28 4
gpt4 key购买 nike

我已经使用线程编写了一个程序。这是我编写的代码示例:

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 的新手,非常感谢我能得到的任何帮助。

最佳答案

您在后台线程中收到 ValueError 的原因是您在该线程的目标函数中显式引发 ValueError:

def CheckTime():
global gamesummary
sleep(5)
print("Time's up!")
gamesummary.close()
raise ValueError

当后台线程引发异常时,它不会杀死整个程序,而是将回溯转储到 stderr 并杀死该线程,让其他线程继续运行。这就是您在这里看到的内容。

如果您不希望这样,请关闭该行。

如果您希望异常会以某种方式影响主线程,那么它不会这样做。但您不需要它来做到这一点。您正在从主线程下关闭文件,这意味着当 AskQuestions 尝试 AskQuestions 尝试写入到文件。你处理得当。这是一个有点奇怪的设计,但它会按预期工作;您不需要在其上添加任何额外的内容。

如果您希望从主线程捕获异常,那也行不通——但同样,这也是不需要的。主线程不受后台线程异常影响。

关于python - try 和 except 以及线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50937505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com