Skip to content

Instantly share code, notes, and snippets.

@marcelotournier
Last active April 13, 2021 18:17
Show Gist options
  • Save marcelotournier/9dda84f7d9e8e8209be75f584a143923 to your computer and use it in GitHub Desktop.
Save marcelotournier/9dda84f7d9e8e8209be75f584a143923 to your computer and use it in GitHub Desktop.
u"""
tentar.py
autor: Marcelo Tournier
url: https://github.com/marcelotournier
objetivo: Minha abstração de um método "Try"
"""
from sys import exc_info
from datetime import datetime
def tentar(func, *args):
"""
Roda uma função dentro de uma "sandbox", retornando
um dicionário com metadados sobre a tentativa, assim como o
resultado do chamado da função na chave 'retorno' do mesmo dicionário.
Essa função é uma abstração para rodar jobs em ambientes assíncronos, quando
vc precisa que o sistema continue mesmo com erros, e precisa logar
exceções de modo conveniente.
Parâmetros:
func: Uma função definida em python
*args: Um iterável contendo os argumentos para a função func
Retorna:
Um dicionário com metadados a respeito da tentativa de rodar a função.
Exemplo:
>>> tentar(len, (1,2,3))
[out]
{'timestamp': '2021-04-13 10:56:06.768881',
'metodo': <function len(obj, /)>,
'args': ((1, 2, 3),),
'resultado': 'SUCESSO',
'retorno': 3}
>>> tentar(int, "abc")
[out]
{'timestamp': '2021-04-13 10:51:32.519986',
'metodo': int,
'args': ('abc',),
'resultado': 'FALHA',
'retorno': ValueError("invalid literal for int() with base 10: 'abc'")}
"""
timestamp = datetime.now().__str__()
try:
tentativa = "SUCESSO"
resultado = func(*args)
except:
tentativa = "FALHA"
resultado = exc_info()[1]
return {
"timestamp": timestamp,
"metodo": func,
"args": args,
"resultado": tentativa,
"retorno": resultado
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment