<jupyter_start><jupyter_text>1. Erros e ExceçõesMesmo quando uma expressão estiver sintaticamente correta, ainda poderão ocorrer erros e neste caso, chamamos de `Exceptions`. Por exemplo, erros causados por divisão por zero.Trata-se `exceptions` em `Python` da seguinte forma:```try:  aqui vão as operações...except exception1:  Se houver a exception1, executar este bloco.  Pode ser um aviso ao usuário informando que a solicição  é impossível se ser executadaexcept exception2:  Se houver a exception3, executar este bloco.else:  Se não houver alguma exception, execute este bloco.Finally:  Este bloco sempre será executado.```Importante: Ainda temos o comando `finally`, que nos permite executar um código, mesmo que exceções ocorram. Ou seja, podemos forçar que algum comando seja executado, independentemente se houver a exceção ou não.Lista completa de `exceptions`: [Built-in Exceptions](https://docs.python.org/3.7/library/exceptions.html)<jupyter_code># Causar um erro de divisão por zero

# Definição da função

def numDiv( x, y ):
  
  resultado = x / y
  
  print( resultado )
# Dividir um número por zero é impossível

# Será gerada uma exceção

numDiv( 4, 0 )<jupyter_output><empty_output><jupyter_text>2. Tratamento de erros Try, Except e Finally<jupyter_code># Gerar outro erro, tentando somar uma string com um número

# Ocorrerá a exception de TypeError

8 + 's'
# Tratando o erro


try:
  8 + 's'
except TypeError: # Quando ocorrer o erro de TypeError
  print( 'Esta operação é impossível!' )
# Usar try, except e else
# Tentar gravar um arquivo no file system

try:
  f = open('/content/sample_data/arquivo.txt', 'w')
  f.write('Conteúdo do arquivo')
except IOError:
  # Quando houver uma exception de leitura/gravação
  print( 'Erro: arquivo não pode ser encontrado ou não pode ser gravado!' )
else:
  print( 'Arquivo gravado com sucesso' )
  f.close()

# Simulação do erro
# Tentar ler o arquivo gravado, sem a sigla de extensão

try:
  f = open('/content/sample_data/arquivo', 'r')
except IOError:
  # Quando houver uma exception de leitura/gravação
  print( 'Erro: arquivo não pode ser encontrado ou não pode ser gravado!' )
else:
  print( 'Arquivo gravado com sucesso' )
  f.close()
# Adicionalmente usar o comando finally, que será executado ocorrendo uma exception ou não

try:
  f = open('/content/sample_data/arquivo.txt', 'w')
  f.write('Conteúdo do arquivo')
except IOError:
  # Quando houver uma exception de leitura/gravação
  print( 'Erro: arquivo não pode ser encontrado ou não pode ser gravado!' )
else:
  print( 'Arquivo gravado com sucesso' )
  f.close()
finally:
  print( 'Este comando sempre será executado!' )
  
# Check if user input a number

def askInt():
  try:
    val = int( input( 'Type a number: ' ) )
  except:
    print( 'You dont type a number!' )
    val = int( input( 'Try again. Type a number:' ) )
  finally:
    print( 'Thanks' )
  print( val )
    
askInt()
# Add a loop While into function

def askInt():
    
    while True:
    
      try:
    
        val = int( input( 'Type a number: ' ) )
    
      except:
    
        print( 'You cant type a number. Try again.' )
    
        continue
    
      else:
        
        print( 'Thanks for typing a number.' )
        
        break
    
      finally:
    
        print( 'End of program.' )
    
      print( val)
askInt()
# Force an error and catch the erros menssage

tup = (1,2,3,4)

try:
  
  tup.append(5) # Remember: tuples are imutable
  
  for each in tup:
    
    print( each )
    
except AttributeError as e:
  
  print( 'Erro: ', e )
  
except IOError as e:
  
  print( 'Erro de I/O: ', e )<jupyter_output>Erro:  'tuple' object has no attribute 'append'
{'fraction_non_alphanumeric': 0.09118046132971507, 'fraction_numerical': 0.004613297150610584, 'mean_word_length': 3.2662037037037037, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '171044', 'license': 'MIT', 'n_tokens_mistral': 1296, 'n_tokens_neox': 1283, 'n_words': 463, 'path': 'src/03_tratamento_arquivos_modulos_pacotes_funcoes_buildin/07_erros_e_excecoes.ipynb', 'repo_name': 'ralsouza/python_fundamentos', 'size': '3685'}