Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como escrever mensagens de erro úteis

Como escrever mensagens de erro úteis

Apresentação para encontro de Python em Floripa

Elias Dorneles

November 04, 2015
Tweet

More Decks by Elias Dorneles

Other Decks in Programming

Transcript

  1. É legal ter um designer projetando as interações com o

    usuário final, inclusive as mensagens de erro
  2. A melhor mensagem de erro é nenhuma Se você sabe

    o que devia fazer, não tente “educar”: just do it! $ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> exit Use exit() or Ctrl-D (i.e. EOF) to exit >>> UGH! Não use a atenção do usuário desnecessariamente.
  3. Às vezes é simplesmente uma questão de tentar de novo

    https://pypi.python.org/pypi/retrying
  4. Exemplo: verificando presença de argumentos def verifica_argumentos(args, obrigatorios): """Verifica se

    argumentos obrigatorios estao presentes no dicionario de argumentos """
  5. Exemplo: verificando presença de argumentos def verifica_argumentos(args, obrigatorios): """Verifica se

    argumentos obrigatorios estao presentes no dicionario de argumentos """ for nome_arg in obrigatorios: if nome_arg not in args: raise ValueError("Argumento obrigatorio: %s" % nome_arg)
  6. Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Argumento obrigatorio: idade
  7. Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Argumento obrigatorio: idade >>> verifica_argumentos({'nome': 'Elias', 'idade': 99}, obrigatorios) ... ValueError: Argumento obrigatorio: cpf UGH!
  8. Exemplo: verificando presença de argumentos def verifica_argumentos(args, obrigatorios): """Verifica se

    argumentos obrigatorios estao presentes no dicionario de argumentos """ faltando = set(obrigatorios) - set(args) if faltando: msg = "Faltando argumentos: %s" % ', '.join(faltando) raise ValueError(msg)
  9. Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Faltando argumentos: idade, cpf
  10. Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Faltando argumentos: idade, cpf >>> verifica_argumentos({'nome': 'Elias', 'idade': 99, 'cpf': '007'}, obrigatorios) >>>
  11. Mesmo princípio em outras situações • Checar espaço disponível antes

    de copiar/descompactar arquivos • Validar campos num formulário à medida que vão sendo preenchidos • Usar asserções que cobrem o máximo possível nos testes de unidade (ex: assertItemsEqual() )
  12. As pessoas em geral não leem mensagens de erro Não

    é burrice: é atenção limitada. Elas têm mais o que fazer do que pegar seu programa pela mão. ;-)
  13. Exemplo: enviando notificação import logging def notifica_produto_disponivel(produto): try: NotificationService.send(type='product_is_available', id=produto.id)

    except Exception as e: msg = ("Erro ao notificar que produto %s esta disponivel: %s" % (produto, e)) logging.error(msg)
  14. Exemplo: def publica_app(app_id): try: deploy_application(app_id) return {'status': 'ok'} except ServiceUnavailable:

    message = ("O serviço está indisponível no momento." " Tente de novo em alguns minutos.") return {'status': 'error', 'message': message}
  15. Outro exemplo: def send_email(email): try: EmailService.send(email) return {'status': 'ok'} except

    UserQuotaExceededError: message = ("You reached the limit for your current plan." " Upgrade plan at: http://example.com/upgrade") return {'status': 'error', 'message': message}
  16. Resumindo: 1. Resolva o problema automaticamente, se possível 2. Aponte

    problemas cedo 3. Seja breve, mas informe o contexto completo 4. Indique como resolver o problema 5. Mantenha profissionalismo -- sem piadas
  17. Obrigado! Perguntas? Elias Dorneles http://twitter.com/eliasdorneles Referências: • http://www.ihearttechnicalwriting. com/write-error-messages/ •

    http://uiwriting.tumblr. com/post/128339130079/4-things-to- improve-ui-writing • http://www.nngroup.com/articles/error- message-guidelines/ • https://developer.gnome.org/hig- book/unstable/language-errors.html.en • http://bugroll.com/how-to-write-good- error-messages.html