revisão de tratamento de erros

--- id: 67f39bcb48373420f4f12d62 title: revisão de tratamento de erros challengeType: 31 dashedName: review-error-handling --- # --description--

Erros comuns em Python

  • SyntaxError: O erro que o Python gera quando seu código não segue suas regras de sintaxe. Por exemplo, o código print("Hello there" levará a um erro de sintaxe com a mensagem, SyntaxError: '(' was never closed, porque o código está sem um parêntese de fechamento.
  • NameError: Python gera um NameError quando você tenta acessar uma variável ou função que não definiu. Por exemplo, se você tiver a linha print(username) no seu código sem ter uma variável username definida primeiro, você receberá um erro de nome com a mensagem NameError: name 'username' is not defined.
  • TypeError: Este é o erro que o Python lança quando você realiza uma operação em dois ou mais tipos de dados incompatíveis. Por exemplo, se você tentar adicionar uma string a um número, você receberá o erro TypeError: can only concatenate str (not "int") to str.
  • IndexError: Você receberá um IndexError se acessar um índice que não existe em uma lista ou outras sequências como tuple e string. Por exemplo, em uma string Hello world, o índice do último caractere é 11. Se você acessar um caractere desta forma, greet = "hello world"; print(greet[12]), você receberá um erro com a mensagem IndexError: string index out of range.
  • AttributeError: Python gera esse erro quando você tenta usar um método ou propriedade que não existe em um objeto desse tipo. Por exemplo, chamar .append() em uma string como "hello".append("!") levará a um erro com a mensagem AttributeError: 'str' object has no attribute 'append'.

Boas técnicas de depuração em Python

  • Usando a função print: Inserir declarações print() em vários pontos do seu código durante a depuração ajuda você a ver os valores das variáveis e como seu código flui.
  • Usando o depurador embutido do Python (pdb): Python fornece um módulo pdb para depuração. Ele faz parte da biblioteca padrão do Python, então está sempre disponível para uso. Com o pdb, você pode definir um trace com a função set_trace() para começar a executar o código passo a passo e inspecionar variáveis de forma interativa.
  • Aproveitando as ferramentas de depuração do IDE: Muitos ambientes de desenvolvimento integrados (IDEs) e editores de código como Pycharm e VS Code oferecem ferramentas de depuração com breakpoints, execução passo a passo, inspeção de variáveis e outros recursos de depuração.

Tratamento de exceções

  • try...except: Isso é usado para executar um bloco de código que pode gerar uma exceção. O bloco try é onde você antecipa que um erro pode ocorrer, enquanto o bloco except captura uma exceção especificada e é executado se esse erro especificado for gerado. Aqui está um exemplo:
try:
    print(22 / 0)
  except ZeroDivisionError:
    print('You can\'t divide by zero!')
    # You can't divide by zero!
Você também pode encadear múltiplos blocos except para que possa tratar mais tipos de exceções:
try:
    number = int(input('Enter a number: '))
    print(22 / number)
  except ZeroDivisionError:
    print('You cannot divide by zero!')
    # You cannot divide by zero! prints when you enter 0
  except ValueError:
    print('Please enter a valid number!')
    # Please enter a valid number! prints when you enter a string
  • else e finally: Esses blocos estendem try...except. Se nenhuma exceção ocorrer, o bloco else é executado. O bloco finally sempre é executado independentemente de erros.
try:
    result = 100 / 4
  except ZeroDivisionError:
    print('You cannot divide by zero!') # This will not run
  else:
    print(f'Result is {result}') # Result is 25.0
  finally:
    print('Execution complete!') # Execution complete!
  • Objeto de exceção: Isso permite que você acesse a exceção em si para um melhor debug e para imprimir a mensagem de erro direta. Para acessar o objeto de exceção, você precisa usar a palavra-chave as. Aqui está um exemplo:
try:
      value = int('This will raise an error')
  except ValueError as e:
      print(f'Caught an error: {e}')
      # Caught an error: invalid literal for int() with base 10: 'This will raise an error'
  • A declaração raise: Isso permite que você levante manualmente uma exceção. Você pode usá-la para lançar uma exceção quando uma determinada condição for atendida. Aqui está um exemplo:
def divide(a, b):
      if b == 0:
          raise ZeroDivisionError('You cannot divide by zero')
      return a / b

Sinalização de exceção

A instrução raise também é útil quando você cria suas próprias exceções personalizadas, pois pode usá-la para lançar uma exceção com uma mensagem personalizada. Aqui está um exemplo disso:
class InvalidCredentialsError(Exception):
      def __init__(self, message="Invalid username or password"):
          self.message = message
          super().__init__(self.message)

  def login(username, password):
      stored_username = "admin"
      stored_password = "password123"
      
      if username != stored_username or password != stored_password:
          raise InvalidCredentialsError()
      
      return f"Welcome, {username}!"
Aqui está como você pode usar a login função com a exceção InvalidCredentialsError:
# failed login attempt
  try:
      message = login("user", "wrongpassword")
  except InvalidCredentialsError as e:
      print(f"Login failed: {e}")
  else:
      print(message)

  # successful login attempt
  try:
      message = login("admin", "password123")
  except InvalidCredentialsError as e:
      # This block is not executed because the login was successful
      print(f"Login failed: {e}")
  else:
      # The else block runs if the 'try' block completes without an exception
      print(message)
A instrução raise também pode ser usada com a palavra-chave from para encadear exceções, mostrando a relação entre diferentes erros:
def parse_config(filename):
    try:
        with open(filename, 'r') as file:
            data = file.read()
            return int(data)
    except FileNotFoundError:
        raise ValueError('Configuration file is missing') from None
    except ValueError as e:
        raise ValueError('Invalid configuration format') from e

  config = parse_config('config.txt')
# --assignment-- Revise os tópicos e conceitos de tratamento de erros.