Aprenda Python

  • Página Inicial
  • Contato!
  • Tudo sobre Python Parte 1!
  • Tudo sobre Python Parte 2!
  • Tudo sobre Python Parte 3!
  • Tudo sobre Python Parte 4!
  • Tudo sobre Python Parte 5!
  • Tudo sobre Python Parte 6!
  • Tudo sobre Python Parte 7!
  • Tudo sobre Python Parte 8!
  • Tudo sobre Python Parte 8

    Tratamento de Erros e Exceções

    Vamos supor um exemplo de erro (por exemplo, usar primt(x)), isso é um erro de sintaxe, mas também tem casos que mesmo sem esse tipo de problema, o programa dá algum erro, vamos supor por exemplo:

    
    print(x)
    
    

    Como a variável x não foi inicializada, ele vai dar um erro semântico, e no PyCharm aparece os erros vermelhos, que é o significado do erro. Nesse caso é chamado de exceção, e no caso foi a "NameError".

    Veja outro exemplo que soltará uma exceção, caso não seja inserido um número:

    
    n = int(input("Número: "))
    print(f"Você digitou o número {n}.")
    
    

    Ele soltará a exceção "ValueError", nesse caso.

    Outro exemplo que pode dar exceção:

    
    a = int(input("Numerador: "))
    b = int(input("Denominador: "))
    r = a / b
    print(f"O resultado é {r}.")
    
    

    Ao colocar denominador "0", ele dará a exceção "ZeroDivisionError".

    Veja esse outro exemplo, que gerará o erro "TypeError":

    
    r = 2 / "2"
    
    

    Esse exemplo dará um "IndexError":

    
    lst = [3, 6, 4]
    print(lst[3])
    
    

    Ao tentar importar um módulo que não existe, gerará a exceção "ModuleNotFoundError".

    Resumindo, as exceções são mensagens disparadas ao ter um erro semântico no programa, que interromperá a execução dele e mostrará um aviso dela.

    Existem muitas exceções em Python, mas a maioria das exceções conseguimos identificar ao fazermos nossos programas com esses erros, e posteriormente tratá-las. Elas são filhas da classe Exception no Python.

    Pra tratar exceções em Python, usamos a estrutura try except, dessa forma:

    
    try:
        # Código a tentar ser executado
    except:
        # Código a ser executado caso o try tenha uma falha
    else:
        # Código a ser executado caso o try não dê erro
    finally:
        # Código a ser executado sempre
    
    

    Eles sempre tem que estar nessa ordem, try, except, else e finally, mas else e finally são opcionais.

    Veja como ficará o programa de divisão assim:

    
    try:
        a = int(input("Numerador: "))
        b = int(input("Denominador: "))
        r = a / b
    except:
        print("Infelizmente deu erro! :(")
    else:
        print(f"O resultado é {r:.1f}.")
    finally:
        print("Volte Sempre!")
    
    

    No caso acima, o erro foi tratado e se tentarmos dividir por zero ou inserir uma string, ele exibirá a nossa mensagem.

    Podemos jogar a exceção numa variável, assim:

    
    try:
        a = int(input("Numerador: "))
        b = int(input("Denominador: "))
        r = a / b
    except Exception as erro:
        print(f"Problema encontrado foi {erro.__class__}.")
    else:
        print(f"O resultado é {r:.1f}.")
    finally:
        print("Volte Sempre!")
    
    

    Toda estrutura try pode ter mais de um except, cada um com seu erro especificado, ao invés de colocar um except genérico, por exemplo:

    
    try:
        a = int(input("Numerador: "))
        b = int(input("Denominador: "))
        r = a / b
    except (ValueError, TypeError):
        print("Tivemos um problema com os tipos!")
    except ZeroDivisionError:
        print("Não é possível dividir por zero!")
    except KeyboardInterrupt:
        print("Não foram informados os dados.")
    except Exception as erro:
        print(f"O erro encontrado foi {erro.__class__}.")
    else:
        print(f"O resultado é {r:.1f}.")
    finally:
        print("Volte Sempre!")
    
    

    PS: Ao testar um programa com exceções, teste fazendo o certo primeiro, pra depois provocar as exceções.

    Veja esse exemplo com arquivos:

    
    try:
        arquivo = open("arquvo.txt", "rt")
    
        for l in arquivo:
            print(l)
    
        arquivo.close()
    except:
        print("Arquivo não Encontrado!")
    
    

    Podemos também criar nossas próprias condições para exceções, usando um if e o comando raise, assim:

    
    try:
        sexo = str(input("Digite o sexo [M/F]: ")).strip().upper()[0]
    
        if sexo not in "MmFf":
            raise Exception("Não foi inserido um sexo válido!")
    except Exception as erro:
        print(erro)
    else:
        print(f"O sexo digitado foi {sexo}.")
    
    

    No caso acima, ele tentará executar o programa, e caso o sexo inserido não seja M ou F, ele lançará a exceção Exception e interromperá a execução no try, passando a executar o except especificado.

    O ideal é colocar o raise numa função, dessa forma:

    
    def verifSexo(sexo):
        if sexo not in "MmFf":
            raise Exception("Não foi inserido um sexo válido!")
    
        print(f"O sexo digitado foi {sexo}.")
    
    try:
        s = str(input("Digite o sexo [M/F]: ")).strip().upper()[0]
    
        verifSexo(s)
    except Exception as erro:
        print(erro)
    
    

    PS: É interessante colocar a cor vermelha nas exceções criadas.

    Manipulando Arquivos com a Biblioteca os

    Podemos usar a biblioteca os para limpar a tela de console do Python:

    
    import os
    
    texto = str(input("Digite algo: "))
    
    os.system("cls" if os.name == "nt" else "clear") # nt é referente ao Windows
    
    print(texto)
    
    

    Pegar caminho:

    
    import os
    
    caminho = os.getcwd()
    
    print(caminho)
    
    

    Mover entre pastas:

    
    import os
    
    varAmb = os.environ["USERNAME"] # Pega variável de ambiente com nome do usuário
    
    novo = "C:\\Users\\{}\\Desktop".format(varAmb)
    
    os.chdir(novo) # Muda caminho
    
    print(os.getcwd())
    
    

    Cria diretórios:

    
    import os
    
    varAmb = os.environ["USERNAME"] # Pega variável de ambiente com nome do usuário
    
    novo = "C:\\Users\\{}\\Desktop".format(varAmb)
    
    os.chdir(novo)
    
    os.mkdir("teste") # Cria pasta
    
    print(os.listdir()) # Lista arquivos do caminho
    
    

    Abrir arquivo especificado:

    
    import os
    
    varAmb = os.environ["USERNAME"] # Pega variável de ambiente com nome do usuário
    
    novo = "C:\\Users\\{}\\Desktop".format(varAmb)
    
    os.chdir(novo)
    
    os.startfile("arquivo.txt") # Abre um arquivo especificado
    
    

    Renomeando arquivos e pastas:

    
    import os
    
    varAmb = os.environ["USERNAME"] # Pega variável de ambiente com nome do usuário
    
    novo = "C:\\Users\\{}\\Desktop".format(varAmb)
    
    os.chdir(novo)
    
    os.rename("arquivo.txt", "arq.txt") # Renomeia, na ordem antigo e novo nome
    
    

    Remover arquivos e diretórios:

    
    import os
    
    varAmb = os.environ["USERNAME"] # Pega variável de ambiente com nome do usuário
    
    novo = "C:\\Users\\{}\\Desktop".format(varAmb)
    
    os.chdir(novo)
    
    os.remove("arq.txt") # Remove arquivo
    
    os.rmdir("test") # Remove pasta
    
    

    Rich no Python: Cores, Emojis, Tabelas e Debug Muito Mais Bonitos

    Para facilitar o uso de cores, emojis, tabelas e outros recursos, podemos usar a biblioteca rich pra isso.

    Depois de instalado, podemos usar a biblioteca para utilizar cores no print de forma muito mais fácil, assim:

    
    from rich import print
    
    print("[red]Olá, Mundo![/red]")
    
    

    No caso acima, ele substitui o print padrão do Python por um print especial da bibliteca Rich, que permite coisas como colocar cores, de forma parecida com o HTML.

    PS: Para isso funcionar, devemos ir em Current File e em Run With Parameters, e em Python, marque em Modify Options, a configuração Emulate Terminal in Output Console.

    Podemos nem escrever o nome do bloco na parte de fechamento, além de colocar emojis, assim:

    
    from rich import print
    
    print("[red]Olá, Mundo![/] :globe_showing_americas:")
    print("[bold blue on white]Olá, Pequeno Gafanhoto![/] :vulcan_salute:")
    print(":+1: :-1:")
    
    

    PS: Para vermos os emojis cadastrados no Rich, digite na linha de comando python -m rich.emoji

    Para criar um painel simples, faça assim:

    
    from rich import print
    from rich.panel import Panel # Atenção as maiúsculas e minúsculas
    
    caixa = Panel("Esse aqui é um painel de exemplo!")
    
    print(caixa)
    
    

    Podemos colocar outras configurações no objeto da classe Panel, assim:

    
    caixa = Panel("[white]Esse aqui é um painel de exemplo![/] :+1:", title = "Mensagem", style = "red", width = 35)
    
    

    No Panel, podemos colocar os blocos de cores e os emojis normalmente.

    Para criar uma tabela, fazemos assim:

    
    from rich import print
    from rich.table import Table # Atenção às maiúsculas e minúsculas
    
    tabela = Table(title = "Tabela de Preços")
    
    tabela.add_column("Nome")
    tabela.add_column("Preço")
    
    tabela.add_row("Lápis", "R$1,50")
    tabela.add_row("Borracha", "R$5,00")
    
    print(tabela)
    
    

    Podemos também configurar alguns dados assim:

    
    tabela.add_column("Nome", justify = "right", style = "red")
    tabela.add_column("Preço", justify = "center", style = "blue")
    
    tabela.add_row("Lápis", "R$1,50")
    tabela.add_row("Borracha", "[green]R$5,00[/]")
    
    

    Podemos melhorar a exibição de alguns dados assim:

    
    from rich import print
    
    print(int.__dict__)
    
    

    E para mostrar os dados de uma classe do Python, faça assim:

    
    from rich import print
    from rich import inspect
    
    inspect(int, all = True)
    
    

    Vamos criar uma função assim:

    
    def divisao(x, y):
        return x / y
    
    print(divisao(50, 0))
    
    

    Ele dará erro devido à exceção (de divisão por zero) não estar sendo tratada. No entanto, podemos usar a biblioteca Rich pra tratar ele, assim:

    
    from rich.traceback import install
    
    install()
    
    def divisao(x, y):
        return x / y
    
    print(divisao(50, 0))
    
    

    Dessa forma, ele exibirá o erro de uma forma mais bonita visualmente.