1
resposta

Dúvida sobre o funcionamento do "Try/Except"

Acabei de assistir a aula sobre "Try/Except" e reparei que o except funciona apenas quando primeiro eu tento um número diferente do 1 - 4 e depois eu tento uma letra, por exemplo a "A". Toda vez que eu inicio o programa já colocando a uma letra no input ao invés de um número que não está dentro das opções, o programa para de imediato. Gostaria de entender se há algum motivo para isso. Muito obrigado desde já Segue o código abaixo:

import os

def exibir_nome_programa():
      print('''
      
░██████╗░█████╗░██████╗░░█████╗░██████╗░  ███████╗██╗░░██╗██████╗░██████╗░███████╗░██████╗░██████╗
██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗  ██╔════╝╚██╗██╔╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔════╝
╚█████╗░███████║██████╦╝██║░░██║██████╔╝  █████╗░░░╚███╔╝░██████╔╝██████╔╝█████╗░░╚█████╗░╚█████╗░
░╚═══██╗██╔══██║██╔══██╗██║░░██║██╔══██╗  ██╔══╝░░░██╔██╗░██╔═══╝░██╔══██╗██╔══╝░░░╚═══██╗░╚═══██╗
██████╔╝██║░░██║██████╦╝╚█████╔╝██║░░██║  ███████╗██╔╝╚██╗██║░░░░░██║░░██║███████╗██████╔╝██████╔╝
╚═════╝░╚═╝░░╚═╝╚═════╝░░╚════╝░╚═╝░░╚═╝  ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝╚══════╝╚═════╝░╚═════╝░
      ''')

def exibir_opcoes():
      print('1. Cadastrar Restaurantes')
      print('2. Listar Restaurantes')
      print('3. Ativar Restaurantes')
      print('4. Sair\n')

def finalizar_app():
      os.system('cls')
      print('Encerrando o app.\n')

def opcao_invalida():
      print('Opção inválida\n')
      input('Digite uma tecla para voltar ao menu principal: ')
      main()

def escolher_opcao():
      opçao_escolhida = int(input('Escolha uma opção: '))
      try:
            if opçao_escolhida == 1:
                  print('Cadastrar restaurantes')
            elif opçao_escolhida == 2:
                  print('Listar Restaurantes')
            elif opçao_escolhida == 3:
                  print('Ativar Restaurantes')
            elif opçao_escolhida == 4:
                  finalizar_app()
            else:
                  opcao_invalida()
      except:
            opcao_invalida()

def main():
      os.system('cls')
      exibir_nome_programa()
      exibir_opcoes()
      escolher_opcao()


if __name__ == '__main__':
      main()
1 resposta

Oi, Vinícius!

Legal que você está explorando o uso de try/except no Python. Vou te ajudar a entender melhor o comportamento que você observou no seu código.

O Problema: Você mencionou que o programa "para de imediato" quando você insere uma letra no input em vez de um número, mas quando você digita um número diferente do esperado, o programa executa o bloco else normalmente. Esse comportamento acontece porque o bloco try/except no seu código está tratando exceções de uma forma um pouco imprecisa.

O Porquê: O try/except está configurado para capturar qualquer exceção que ocorra, mas o que está acontecendo é que o Python lança uma exceção ValueError quando você tenta converter uma letra para int (com a função int(input(...))). Quando isso ocorre, o except é acionado, mas o seu código acaba chamando a função opcao_invalida() diretamente, o que pode levar o programa a reiniciar ou se comportar de maneira inesperada.

O que está acontecendo no seu código: Quando você tenta converter uma letra para um número (usando int(input(...))), o Python lança um ValueError. Isso aciona o except, que chama a função opcao_invalida(). Mas, por conta da recursão de main() dentro de opcao_invalida(), isso acaba causando a execução do fluxo novamente e pode parecer que o programa "para de imediato", mas na verdade ele só está reiniciando.

A Solução: O que você pode fazer é tratar a exceção de maneira mais específica, para que o programa não reinicie de forma inesperada e apenas trate o erro de entrada do usuário de maneira mais clara.

Testa esse código aqui:

import os

def exibir_nome_programa(): print('''

░██████╗░█████╗░██████╗░░█████╗░██████╗░  ███████╗██╗░░██╗██████╗░██████╗░███████╗░██████╗░██████╗ ██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗  ██╔════╝╚██╗██╔╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔════╝ ╚█████╗░███████║██████╦╝██║░░██║██████╔╝  █████╗░░░╚███╔╝░██████╔╝██████╔╝█████╗░░╚█████╗░╚█████╗░ ░╚═══██╗██╔══██║██╔══██╗██║░░██║██╔══██╗  ██╔══╝░░░██╔██╗░██╔═══╝░██╔══██╗██╔══╝░░░╚═══██╗░╚═══██╗ ██████╔╝██║░░██║██████╦╝╚█████╔╝██║░░██║  ███████╗██╔╝╚██╗██║░░░░░██║░░██║███████╗██████╔╝██████╔╝ ╚═════╝░╚═╝░░╚═╝╚═════╝░░╚════╝░╚═╝░░╚═╝  ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝╚══════╝╚═════╝░╚═════╝░ ''')

def exibir_opcoes(): print('1. Cadastrar Restaurantes') print('2. Listar Restaurantes') print('3. Ativar Restaurantes') print('4. Sair\n')

def finalizar_app(): os.system('cls') print('Encerrando o app.\n')

def opcao_invalida(): print('Opção inválida, por favor digite uma opção entre 1 e 4.\n') input('Digite uma tecla para voltar ao menu principal: ')

def escolher_opcao(): try: opçao_escolhida = int(input('Escolha uma opção: ')) # Tenta converter para inteiro if opçao_escolhida == 1: print('Cadastrar restaurantes') elif opçao_escolhida == 2: print('Listar Restaurantes') elif opçao_escolhida == 3: print('Ativar Restaurantes') elif opçao_escolhida == 4: finalizar_app() else: opcao_invalida() # Caso a opção seja diferente de 1 a 4 except ValueError: print('Erro! Por favor, insira um número válido (1, 2, 3 ou 4).') opcao_invalida()

def main(): os.system('cls') exibir_nome_programa() exibir_opcoes() escolher_opcao()

if name == 'main': main()