尝试与除外和线程错误

时间:2018-06-19 21:59:35

标签: python multithreading try-catch

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

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

1 个答案:

答案 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异常。您正在正确处理。这有点奇怪,但是可以按预期工作。您不需要在上面添加任何额外的内容。

如果您希望从主线程中捕获异常,那么该异常也不起作用-但同样,它不是必需的。主线程不受后台线程异常的影响。