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.
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
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.