Просто нужно это для игровой программы. В конце программы «Rock-Paper-Scissors» он спрашивает, хочет ли пользователь играть снова или нет, и использует sys.exit() для завершения программы. Однако вместо завершения программы, если пользователь вводит что-то, кроме 'Y' или 'y', в функцию replayFunc(), он входит в код в блоке except: в {{X3} } . Любая помощь приветствуется.

import random
import os
import sys

userOS = str(sys.platform)

def clearFunc():
  if "win32" not in userOS:
    os.system('clear')
  else:
    os.system('cls')

def replayFunc():
  exitPrompt = input("Do you want to play again? (Y/N): ")
  if exitPrompt == 'Y' or exitPrompt == 'y':
    main()
  else:
    sys.exit(0)


def main():
  oppChoice = random.randint(1,3)
  playerChoice = int
  print("Welcome to Rock-Paper-Scissors!")
  input("\nPress Enter to continue: ")
  clearFunc()

  try:
    playerChoice = int(input("Please use 1-3 to select from the list below:\n\n1. Rock\n2. Paper\n3. Scissors\n"))
    if playerChoice == 1 and oppChoice == 1:
      print("You tied!")
      replayFunc()
    elif playerChoice == 1 and oppChoice == 2:
      print("Computer Wins!")
      replayFunc()
    elif playerChoice == 1 and oppChoice == 3:
      print("You win!")
      replayFunc()

    elif playerChoice == 2 and oppChoice == 1:
      print("You win!")
      replayFunc()
    elif playerChoice == 2 and oppChoice == 2:
      print("You tied!")
      replayFunc()
    elif playerChoice == 2 and oppChoice == 3:
      print("Computer Wins!")
      replayFunc()

    elif playerChoice == 3 and oppChoice == 1:
      print("Computer wins!")
      replayFunc()
    elif playerChoice == 3 and oppChoice == 2:
      print("You win!")
      replayFunc()
    elif playerChoice == 3 and oppChoice == 3:
      print("You tied!")
      replayFunc()
    else:
      print("Didn't get that")
      main()


  except:
    print("TypeError")
    main()

main()

0
user12049345 21 Дек 2019 в 06:24

1 ответ

Лучший ответ

sys.exit(0) в основном реализуется как raise SystemExit(0). Это исключение, потому что вам необходимо всплыть, чтобы диспетчеры контекста (операторы with) и блоки finally могли очиститься должным образом.

Причина, по которой голый except: не одобряется, заключается в том, что он улавливает даже исключения, которые не следует перехватывать, например SystemExit. Так что прекратите его использовать и перехватывайте только исключения, которые вы умеете обрабатывать, или, по крайней мере, измените его на except Exception:, который не будет перехватывать особые, не должны перехватывать исключения (например, SystemExit и KeyboardInterrupt).

2
ShadowRanger 21 Дек 2019 в 03:32