Ошибка с попыткой и исключением и потоком

1

Я написал программу, используя поток. Вот пример кода, который я написал:

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, и я очень благодарен за любую помощь, которую я смогу с этим справиться.

Теги:
multithreading
try-catch

1 ответ

2
Лучший ответ

Причина, по которой вы получаете 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 в файл. Который вы правильно обрабатываете. Это немного странный дизайн, но он будет работать по назначению; вам не нужно добавлять что-либо лишнее поверх него.

Если бы вы надеялись поймать исключение из основного потока, это тоже не сработает - но опять же, это не нужно. Исключением фонового потока не влияет основной поток.

  • 0
    Большое спасибо, я понимаю, что я сделал сейчас ~

Ещё вопросы

Сообщество Overcoder
Наверх
Меню