Como escrever mensagens de erro úteis

Como escrever mensagens de erro úteis

Apresentação para encontro de Python em Floripa

Dfd7b9492f5c5e49dca373bfdd7a3b1a?s=128

Elias Dorneles

November 04, 2015
Tweet

Transcript

  1. 4.

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

    usuário final, inclusive as mensagens de erro
  2. 5.

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

    Às vezes é simplesmente uma questão de tentar de novo

    https://pypi.python.org/pypi/retrying
  4. 8.

    Exemplo: verificando presença de argumentos def verifica_argumentos(args, obrigatorios): """Verifica se

    argumentos obrigatorios estao presentes no dicionario de argumentos """
  5. 9.

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

    Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Argumento obrigatorio: idade
  7. 11.

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

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

    Exemplo: verificando presença de argumentos >>> obrigatorios = ('nome', 'idade',

    'cpf') >>> verifica_argumentos({'nome': 'Elias'}, obrigatorios) ... ValueError: Faltando argumentos: idade, cpf
  10. 15.

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

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

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

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

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

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

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

    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