Quais são os problemas do desenvolvedor com mensagens de erro úteis? [fechadas]


29

Continua me surpreendendo que, atualmente, produtos com anos de uso, criados por equipes de profissionais, ainda hoje - falhem em fornecer mensagens de erro úteis ao usuário. Em alguns casos, a adição de apenas um pequeno pedaço de informação extra pode economizar horas de problemas para o usuário.

Um programa que gera um erro, gerou por um motivo. Ele tem tudo a sua disposição para informar ao usuário o máximo possível, por que algo falhou. E, no entanto, parece que fornecer informações para ajudar o usuário é de baixa prioridade. Eu acho que isso é uma falha enorme.

Um exemplo é do SQL Server. Quando você tenta restaurar um banco de dados que está em uso, ele não o deixa com razão. O SQL Server sabe quais processos e aplicativos estão acessando. Por que não pode incluir informações sobre os processos que estão usando o banco de dados? Eu sei que nem todo mundo passa um Applicatio_Nameatributo em sua cadeia de conexão, mas mesmo uma dica sobre a máquina em questão pode ser útil.

Outro candidato, também o SQL Server (e o mySQL), é a adorável string or binary data would be truncatedmensagem de erro e equivalentes. Muitas vezes, uma simples leitura da instrução SQL que foi gerada e a tabela mostra qual coluna é a culpada. Isso nem sempre é o caso, e se o mecanismo de banco de dados detectou o erro, por que ele não pode nos poupar esse tempo e apenas nos diz qual coluna danificada era? Neste exemplo, você pode argumentar que pode haver um impacto no desempenho ao verificá-lo e que isso impediria o escritor. Tudo bem, eu vou comprar isso. Que tal, uma vez que o mecanismo do banco de dados saiba que há um erro, ele faz uma rápida comparação após o fato, entre os valores que seriam armazenados, e os comprimentos das colunas. Em seguida, exiba isso para o usuário.

Os horríveis adaptadores de tabela do ASP.NET também são culpados. As consultas podem ser executadas e uma mensagem de erro pode ser informada que uma restrição em algum lugar está sendo violada. Obrigado por isso. Hora de comparar meu modelo de dados com o banco de dados, porque os desenvolvedores estão com preguiça de fornecer até um número de linha ou dados de exemplo. (Para o registro, eu nunca usaria esse método de acesso a dados por opção , é apenas um projeto que herdei!).

Sempre que eu lançar uma exceção do meu código C # ou C ++, forneço tudo o que tenho em mãos para o usuário. Foi tomada a decisão de lançá-lo, para que quanto mais informações eu possa fornecer, melhor. Por que minha função lançou uma exceção? O que foi repassado e o que era esperado? Demoro um pouco mais para colocar algo significativo no corpo de uma mensagem de exceção. Inferno, isso não ajuda em nada enquanto eu desenvolvo, porque eu sei que meu código lança coisas que são significativas.

Pode-se argumentar que mensagens de exceção complicadas não devem ser exibidas ao usuário. Embora eu discorde disso, é um argumento que pode ser facilmente aplacado por se ter um nível de verbosidade diferente, dependendo da sua compilação. Mesmo assim, os usuários do ASP.NET e do SQL Server não são seus usuários comuns e preferem algo cheio de informações detalhadas e deliciosas, porque podem rastrear seus problemas mais rapidamente.

Por que os desenvolvedores acham que é bom, atualmente, fornecer a quantidade mínima de informações quando ocorre um erro?

É 2011 pessoal, vamos .


11
Uau, isso é muito divertido.
George Marian

3
@ George, você pode dizer que acabei de passar um longo tempo rastreando algo que realmente poderia ter sido resolvido mais rapidamente, devido a um erro adequado? :)
Moo-Juice

4
Sugiro respirações profundas, talvez um pouco de ioga e meditação. :) (Dito isto, eu sei exatamente como você se sente.)
George Marian

2
+1 - "dados de cadeia ou binários seriam truncados" sempre me deixa louco!
k25 17/01/11

Respostas:


22

Embora existam muitos exemplos de mensagens de erro incorretas que simplesmente não deveriam ser, lembre-se de que nem sempre é possível fornecer as informações que você deseja ver.

Também existe a preocupação de expor muitas informações, o que pode levar os desenvolvedores a erros por precaução. (Prometo que o trocadilho não foi planejado, mas não o estou removendo agora que o notei.)

Às vezes, também há o fato de que uma mensagem de erro complexa é inútil para o usuário final. O acompanhamento da sobrecarga de informações não é necessariamente uma boa abordagem para mensagens de erro. (Isso pode ser melhor guardado para o log.)


+1 Eu nem pensei no aspecto de sobrecarga de informações.
perfil completo de Ryan Hayes

Expliquei no meu post que posso entender por que alguns acham que a verbosidade para um usuário final pode ser inútil para eles. Mas você está dizendo que os usuários finais de uma API (adaptadores do ASP.NET ag) ou de um mecanismo de banco de dados (SQL-Server) não desejam erros detalhados? Algo que nos pouparia potencialmente horas de tempo perdido? Eu gostei do trocadilho, a propósito :)
Moo-Juice

1
@George, também no que diz respeito à sobrecarga de informações e à sua utilidade para o usuário final, novamente eu vejo um caso por não lançar um rastreamento de pilha completo para o usuário de um processador de texto, para que eles não tenham um momento de calça marrom e acho que eles excluíram a internet. No entanto, você forneceu uma excelente alternativa com informações complexas no arquivo de log. Tudo o que a mensagem precisa fazer agora é adicionar For further information, see log20111701.txt. Este seria um passo na direção certa.
Moo-Juice

2
@moo Finalmente, o que estou dizendo é que é fácil criticar. (Eu sei, faço isso com frequência.) No entanto, tento lembrar que não é necessariamente fácil dizer quanta informação você deve incluir em uma mensagem de erro. Muitas vezes tive que voltar e gerar informações mais detalhadas do que eu esperava inicialmente durante a depuração. Além disso, há muitas vezes em que uma mensagem de erro não foi tão útil quanto eu havia antecipado ao criá-la.
George Marian

1
@moo O ponto crucial do problema é que nem sempre é óbvio quanta informação é útil. Os exemplos que você fornece parecem bastante óbvios. No entanto, não é fácil estender isso para o caso geral.
George Marian

21

Os desenvolvedores não são as pessoas certas para escrever mensagens de erro.

Eles veem a aplicação do ângulo errado. Eles estão extremamente conscientes do que deu errado dentro do código, mas geralmente não abordam o software do ponto de vista de tentar realizar algo. Como resultado, as informações importantes para o desenvolvedor não são necessariamente informações importantes para o usuário.


+1 Para muitos dos erros de estrutura / API, parte do problema é que o desenvolvedor da biblioteca não pode conhecer o contexto. Dito isto, o OP parece principalmente preocupado com os tipos de "mensagens de erro", mas não vou lhe dizer onde, embora eu saiba. Eu acho que é segurança, certo?
MIA

8

A visão de caridade:

  • O desenvolvedor trabalhou em estreita colaboração com o código e se esforçou para compreender alguém que não tinha seu entendimento trabalhando com ele. Como resultado, eles acham que as mensagens de erro são boas, simplesmente não têm um bom quadro de referência para julgá-las.

  • Mensagens de erro inteligentes são realmente difíceis de fazer. Não apenas escrevendo-os, mas você precisa descobrir tudo o que pode dar errado, avaliar a probabilidade e fornecer informações úteis (que quase certamente variam de acordo com o contexto) de volta para a pessoa que está lendo a mensagem para permitir que ela seja corrigida.

  • Para a maioria dos aplicativos, é difícil justificar a hora de fazer esse tipo de coisa, assim como o próximo desenvolvedor gostaria, porque os erros não ocorrem com tanta frequência. Além disso, se você tivesse esse tempo extra, não deveria gastá-lo parando os erros em vez de reportá-los?

A visão não caridosa:

  • As mensagens de erro e a manipulação de erros são monótonas, há coisas muito mais interessantes para se trabalhar e meu chefe está de costas sobre a próxima coisa. Eu entendo esse código, eu vou ficar bem, o próximo cara vai resolver isso no final e eu vou sair daqui até lá, então não é problema meu.

A realidade provavelmente está em algum lugar no meio, embora minha experiência realmente me diga que é muito mais antiga do que posterior - basicamente, é realmente muito difícil e exige bastante esforço para lidar com algo que provavelmente não acontecerá.


Entendo de onde você é em muitos casos de usuários finais. No entanto, os casos descritos em minha postagem original podem ocorrer com freqüência enquanto escrevemos código em bancos de dados. No que diz respeito aos aplicativos do usuário final, como um processador de texto ou um jogo de computador, os erros geralmente não devem estar acontecendo a menos que algo ruim esteja acontecendo, e mesmo assim o erro pode não significar nada para o usuário final ( Process Handle Raped By Spawned Injector, Quitting SYstem..... user: "wtf eu fiz`) Mas no caso do SQL Server / ASP.NET, acho que mais esforço poderia ter sido feito :)?.
Moo-Juice

@ Moo-Juice - Eu acho que isso se resume a toda a coisa "mensagens de erro são difíceis". Sob o capô, o que realmente é jogado no banco de dados, uma vez que o otimizador o faz, tem uma semelhança passageira com o que você jogou nele. Identificar o erro é uma coisa, rastrear o que aconteceu com o que você passou é outra completamente e absolutamente não é trivial.
Jon Hopkins

alguns casos podem não ser triviais. Um simples código em algum lugar que captura o string/binary dataerro que extrai todas as informações da coluna da tabela, examina os valores passados ​​e mostra quais colunas estariam violando. Isso foi trivial. Talvez eu esteja reclamando demais porque meus exemplos de casos são triviais, mas eu entendo perfeitamente que nem sempre é esse o caso. Como paramos injetores gerado a partir de estuprar processos pode muito bem ser difícil :)
Moo-Juice

6

Infelizmente, mensagens de erro mais úteis custam tempo ao desenvolvedor, que é igual ao dinheiro da empresa. Os produtos são caros o suficiente para serem construídos como estão. Sim, seria incrível ter mensagens de erro mais úteis, e eu concordo que deve haver outras mais úteis. No entanto, é apenas um fato da vida que, quando você está dentro de um prazo, e o dinheiro está em jogo, você precisa cortar algo. "Mensagens de erro mais bonitas", como os gerentes podem ver, provavelmente serão a primeira coisa a ser feita.


Ah, sim, bom argumento. Essa sempre presente preocupação de custo.
George Marian

Eu posso admitir uma perspectiva de custo (e caramba, isso não significa que eu precise gostar ). Eu não posso falar do ponto de vista dos desenvolvedores do SQL Server ou ASP.NET, mas eu sei que não é preciso que muito esforço extra para fornecer um nome de coluna. Admito que, no meu exemplo simples, isso pode ser resolvido em uma hora. Depois, há os outros 1000 erros que podem ser gerados. Mas eles poderiam, pelo menos, começar com os comuns queridos :)
Moo-Juice

é claro que eu não conheço os elementos internos do servidor SQL - mas, de um modo geral, na maioria das vezes você não tem essas informações em mãos no momento em que a situação de erro é detectada. Uma formulação como "string ou dados binários" muito claramente mostra que no local de erro, não é sequer claro se o valor truncado foi uma string ou um número ...
Ichthyo

Em algum nível, isso pode ser válido, mas o mesmo problema surge em scripts perl simples, onde basta adicionar $! para a mensagem de erro seria imensamente útil. É mais barato (em termos de tempo do desenvolvedor) escrever 'die "$ path: $!"' Do que escrever o absolutamente inútil 'die "Não foi possível abrir o $ path"'
William Pursell

6

Concordo que as mensagens de erro devem ser o mais específicas possível.

Uma razão para mensagens de erro genéricas é provavelmente o uso de códigos de erro. Ao usar exceções, você pode passar tudo o que precisa na mensagem de erro. Usando códigos de retorno, não há espaço para codificar um nome de coluna. Talvez o erro seja tratado por uma função genérica que não conhece o contexto e simplesmente converte o código do erro em uma string.


é ainda pior: embora você possa desencadear erros em pontos muito específicos, para lidar com erros, você é forçado a incluir várias possibilidades em uma classe de situações e lidar com elas com uma única recuperação. Esse ato de generalização frequentemente obriga a descartar ainda mais informações escassas de contexto adicionais.
precisa saber é o seguinte

btw ... esse mecanismo leva a uma classe inteira de mensagens de erro engraçadas - ao longo das linhas de "Falha grave -567 no módulo dwarf678: nenhum erro detectado"
Ichthyo

4
  • Às vezes, muitas informações podem ser um risco à segurança; você não sabe quem está lendo a mensagem de erro
  • Às vezes, a operação que gerou a exceção é tão complexa que é impossível receber uma mensagem significativa sem afetar negativamente a velocidade / complexidade do código

Respondi ao seu primeiro ponto, permitindo uma alteração na verbosidade das exceções geradas no seu código. Seu segundo ponto é discutível, já que neste momento ocorreu um erro e a velocidade não é mais um fator decisivo (imho). E se a produção de uma mensagem de erro detalhada exigir um impacto no desempenho antes de lançar a exceção, eu concordo. Mova esse código para APÓS a exceção ser lançada. Eu não vejo qualquer um destes pontos como um argumento válido contra mensagens de erro adequadas :)
Moo-Juice

É verdade que suponho que você possa procurar as informações assim que algo acontecer, em vez de acompanhar o que pode ser necessário. Embora, se você estiver em loops aninhados, capturar os índices / índices pode ser problemático.
StuperUser

-1 para o primeiro ponto com o qual não concordo, +1 para o segundo ponto.
Jon Hopkins

1
@jon Contraste uma mensagem de erro genérica para erros de login em comparação com mensagens de erro mais específicas que realmente indicam o que deu errado. por exemplo, "Não foi possível encontrar a combinação de nome de usuário / senha" vs "Você digitou uma senha incorreta." / "Esse nome de usuário não existe." Parece que me lembro de uma vulnerabilidade no ASP.NET em que a mensagem de erro era realmente útil para quebrar as chaves de criptografia.
George Marian

@ George - Eu concordo com esse exemplo, mas não acho que seja generalizado. Depois que você recebe acesso a um aplicativo, um certo nível de risco desaparece, pois você pode assumir que a pessoa está (a) autorizada e (b) pode obter o que é necessário com o aplicativo real.
Jon Hopkins

3

Como aviso geral, você deve considerar que qualquer erro ou situação excepcional é - exatamente isso: excepcional. Ele cruza o procedimento planejado e projetado. É incompatível com o modo como as coisas planejavam funcionar. Se não fosse esse o caso, não haveria necessidade de resgatar um erro de abortamento.

Nós programadores somos treinados para cuidar da autoproteção deste procedimento planejado. Assim, incluímos rotineiramente algumas verificações de sanidade para verificar nossas suposições. Quando essas verificações de sanidade falham, sabemos que o plano falhou de alguma forma ...

Sua demanda - pode parecer senso comum da perspectiva do usuário - é impossível de ser atendida, se você considerar a realidade de como esse sistema funciona. Você pede uma declaração ordenada com informações bem organizadas e adequadas adicionadas. Além disso, você ainda solicita que esta apresentação ocorra de uma maneira que se encaixe no design geral de aplicação / manuseio. Obviamente, esta informação existe em algum lugar do sistema. Obviamente, ele existe até lá de uma maneira ordenada e bem organizada (esperemos que sim). MAS, no momento em que o erro ocorre, ninguém jamais planejou disponibilizar essas informações. Um erro sempre é uma perda parcial de controle.Essa perda de controle pode ocorrer em vários níveis. Pode ser que o sistema esteja se comportando em tempo de execução diferente do planejado. Mas também pode ser que a implementação real tenha se mostrado muito mais difícil e diferente nos detalhes planejados, e não havia provisão para lidar com essa situação de maneira satisfatória. Isso também é uma perda parcial de controle.

Para relacionar isso ao exemplo concreto que você forneceu: Se, no ponto do erro, o nome e o tipo da coluna da tabela fossem conhecidos e, além do comprimento do espaço necessário, não haveria motivo para levantando um erro, não é? Poderíamos apenas consertar a situação e prosseguir como planejado. O próprio fato de sermos forçados a cometer um erro mostra que as coisas se perderam. O simples fato de essas informações não estarem disponíveis é a exceção .

O que estou escrevendo aqui pode parecer óbvio e mero senso comum. Mas, na realidade, é extremamente difícil de entender. Tentamos constantemente entendê-lo aplicando categorias morais - como deve haver um culpado, deve haver uma pessoa preguiçosa que não se importa com o usuário pobre, deve haver empresários gananciosos que fizeram um caminho para cálculos baratos. Tudo isso está além do ponto

A possibilidade de perda de controle decorre do fato de estarmos fazendo as coisas de maneira planejada e ordenada .


Eu tenho que discordar. Ele sabe que algo está errado (não pode executar a operação). Saber que algo está errado indica um conhecimento de por que está errado. Essa sequência é muito grande para essa coluna (ou uma coluna nessa tabela). Ele poderia me dizer, sem muito trabalho. É um maldito mecanismo de banco de dados corporativo. Ele sabe . Mas não transmite essa informação. Dado que o programador pode escrever uma consulta para executar após o fato para descobrir mostra que o mecanismo de banco de dados pode fazer o mesmo. Essas não são facetas secretas e não documentadas. Apenas uma mensagem de erro porcaria :) :)
Moo-Juice

heh ... você deve basear seu argumento na lógica, não no pensamento caprichoso. Desde quando um computador sabe alguma coisa? Este não é o cinema de Hollywood. Um programa é uma configuração rígida e pré-organizada e, quando suas suposições são quebradas, você perde o controle. Isso é realmente tão difícil de entender? Um computador não entende o programa e, portanto, ele não consegue entender quando está errado. Quase sempre, quando alguma verificação de consistência é acionada, a execução já foi executada por milhares de instruções e ninguém sabe quais dados já foram corrompidos. Tudo o que você pode fazer é limitar o dano
Ichthyo 18/01/11

2

Eu trabalho como engenheiro de suporte de uma empresa de software e frequentemente vemos mensagens de erro novas para nós. Freqüentemente, quando as refiro à nossa equipe de desenvolvimento, elas precisam procurar a mensagem na fonte do aplicativo.

Parece-me que, mesmo que não fosse apresentado aos usuários, seria muito seguro para nós se a equipe de desenvolvimento adicionasse uma nota a um documento ou banco de dados do índice de mensagens de erro sempre que adicionassem um novo. muito mais rápido para encontrar a causa dos problemas dos clientes e economizar tempo também ...


1
desculpe, isso é bastante impraticável. Quem seria responsável por gerenciar esse documento de índice, por mantê-lo preciso. Como qualquer documentação escrita separada do código, ela estaria desatualizada e começaria a obter uma fonte para novos erros no momento em que for escrita.
Ichthyo

Pelo contrário, esse é o tipo de coisa que um script poderia extrair do código-fonte, se cada erro tivesse um número único e a descrição de cada um também estivesse no código, na forma de um comentário (especialmente formatado) ou como um corda. Portanto, o documento será gerado automaticamente a cada compilação. A mensagem extraída pode ser um pouco mais detalhada do que qualquer coisa que você queira que o usuário final veja. Não é uma má ideia!
precisa saber é o seguinte

você não precisa de um script para isso - muitos sistemas de tempo de execução podem registrar o número da linha ou informações semelhantes. Infelizmente, isso não ajuda no problema original, pois assim sabemos apenas onde uma exceção foi detectada, mas não sabemos o que deu errado . Descobrir o último é chamado de depuração - na prática, essa é uma tarefa mais ou menos tediosa e trabalhosa, feita por humanos.
precisa saber é o seguinte

Estou com @ Jeanne - simples o suficiente para incorporar no código ou ter um índice central no código com o código de erro e sua interpretação. Depois de saber onde uma exceção foi detectada, isso pode ser suficiente para informar que há um problema com o ambiente em algum lugar, em vez de algo no código que precisa ser perseguido.
glenatron

2

O problema que você está vendo é, na verdade, um dos efeitos colaterais do encapsulamento adequado e ocultação de informações.

Os sistemas modernos são extremamente complicados. Há poucas chances de que o desenvolvedor médio consiga manter, em sua cabeça, um modelo mental de todo o sistema, da interface do usuário ao binário bruto, enquanto codifica qualquer tarefa em particular.

Assim, enquanto um desenvolvedor está sentado e codificando, digamos, o bit que restaura um arquivo de banco de dados, seu modelo mental é preenchido inteiramente com os bits que cercam o ato de restaurar um arquivo de banco de dados. Ele precisa (e suponho, ainda não escrevi esse código) ler um arquivo, verificar propriedades, ler versões, fazer backup de dados existentes, escolher uma estratégia de mesclagem / substituição, etc. É bem provável que exista uma passagem. consideração à interface do usuário, está na sequência de erros que ele escreve em um manipulador de exceções. Algo como:

catch (IOException error)
{
//File is in use
throw new GenericExceptionParsedByTheUIThread("File is in use.");
}

Neste exemplo, as informações úteis sobre as quais você está perguntando em termos de processos que podem estar usando o arquivo, ou mesmo outros encadeamentos no banco de dados, estão completamente fora do escopo (programaticamente). Pode haver centenas de classes que lidam com arquivos de banco de dados; importar para essas classes informações sobre todos os outros processos que usam os arquivos ou funcionalidade para acessar o sistema de arquivos e observar os outros processos em execução (supondo que esses processos estejam nesta máquina) resultaria no que é conhecido como abstração com vazamento ; há um custo direto em produtividade.

É assim que esses tipos de erros podem persistir nos dias modernos. Obviamente, todos eles poderiam ser consertados; mas, em muitos casos, há muito mais custos indiretos envolvidos do que se imagina (nesse caso, por exemplo, talvez seja necessário que essa função percorra a enumeração de conexões e compartilhamentos de rede para ver se uma máquina remota está usando esse arquivo de banco de dados para alguns razão) e o custo está longe de ser trivial.


@GWLlosa, esta é uma ótima resposta e que eu não havia considerado. Dito isto (e não posso fornecer um exemplo de código completo aqui), quando recebo a IOException, antes de lançar minha GenericException, eu poderia 1) Pedir ao ProcessesSubsistema uma lista de processos. 2) Pergunte a cada processo que banco de dados eles estão usando. 3) Associe o processo ao banco de dados atribuído àquele que estou tentando substituir; 4) lance uma DatabaseInUse(dbName, processName, applicationNameexceção. :)
Moo-Juice

1
Certamente possível; mas o código para corresponder o banco de dados ao processo (especialmente na rede) pode ser complicado / lento / propenso a erros, o que pode resultar em alguma frustração adicional ("Estou apenas tentando restaurar o local (* #% ^! arquivo% !!!! porque eu me importo que as ações da rede não são acessíveis ?? ")!?!
GWLlosa

1
@ Moo-Juice: o que você propõe parece bastante ingênuo. Em um ambiente multithread maciço como um banco de dados, você não pode simplesmente acessar um serviço global para obter uma lista de "all xyz". Mesmo para conversar com outro serviço em outro encadeamento, você precisa de um bloqueio, o que pode piorar o sistema inteiro, pode corromper outros dados ou, pelo menos, causar erros adicionais, os quais você também deve manipular ....
Ichthyo

1
Esse exemplo é realmente muito instrutivo: normalmente, em um manipulador de captura, você não pode nem ter certeza de qual parte do bloco try falhou (geralmente existem várias partes que podem causar uma IOException). Além disso, é muito provável que nesse local você não possa dizer o nome do arquivo, para não saber qual tabela lógica corresponde a esse arquivo.
precisa saber é o seguinte

@ Ichthyo, sem ofensas, mas não acho que seja ingênuo. Não estou pedindo ao mecanismo de banco de dados que bloqueie o sistema para me dizer qual processo ainda tem um identificador para um banco de dados. Não estou pedindo para interromper toda a empresa. Se precisar fornecer uma resposta simples, isso mostra uma falha de design fundamental do servidor de banco de dados. Lembre-se de que ele deve ser projetado para fornecer informações pertinentes da maneira mais rápida possível. Para fazer a pergunta "quem?" realmente não deve ser tão ingênua quanto você indicar :)
Moo-Juice

2

Meu favorito era (no final dos anos 70) o compilador Univac Fortran IV, ao ler sem dígitos, anunciado fielmente

A interpretação de dados sem sentido foi tentada


+1, absolutamente fantástico! É o tipo de erro que faz com que você queira desistir e criar galinhas em Fiji.
Moo-Juice

na verdade, essa mensagem de erro é 100% precisa - se você deseja uma mensagem mais amigável com mais conetxt, precisa criar algumas suposições e heurísticas; Dessa forma, você adiciona a possibilidade de mensagens de erro enganosas .
Ichthyo 18/01/11

0

Acredito que a maioria das mensagens de erro seja realmente um código de depuração glorificado (auto) orientado a programadores / instruções printf.

Escrever mensagens de erro orientadas ao usuário significa saber quem é o usuário e antecipar o que ele deseja saber. No meio da escrita do código, um desenvolvedor está mais apto a escrever uma mensagem de erro útil para si, para depurar o código que está escrevendo no momento ou útil para os Casos de Uso conhecidos ou predominantes.

Mudar de escrever código para projetar uma parte textual da interface do usuário (ou experiência do usuário) é uma opção de contexto. Em aplicativos grandes, como aplicativos multilíngues, que podem significar que são entregues a uma pessoa ou equipe diferente (UI, tradução), em vez de serem totalmente manipulados pelo desenvolvedor, portanto, a menos que o desenvolvedor explique cuidadosamente o contexto da mensagem, detalhes importantes podem ser facilmente perdido.

Obviamente, verificar e verificar o tratamento de erros é frequentemente considerado de baixa prioridade, desde que sejam tratados erros e exceções (ou seja, capturados), mas não é dada muita ênfase a ele. É um local mentalmente não recompensador da base de código para os desenvolvedores ou o controle de qualidade avaliarem, pois as condições de erro geralmente têm uma conotação negativa (ou seja, erro ou falha) associada a eles.


0

Eu acho que a razão é que o relatório / tratamento de erros sempre é feito como uma reflexão posterior . Mesmo quando não são totalmente pensados, são principalmente cidadãos de segunda classe no design geral.

O software moderno geralmente consiste em várias camadas. Quando sua lógica de relatório de erros é estabelecida rapidamente, sem muita reflexão, geralmente é difícil reunir todas as informações necessárias para apresentar mensagens de erro úteis.

Por exemplo, o erro é detectado no back-end, mas ele precisa de algumas informações das camadas superiores para compor uma mensagem de erro abrangente. A maioria das boas mensagens de erro precisa de informações de quase todas as camadas (para nos dar uma visão abrangente do que aconteceu no sistema). A mensagem de erro ideal seria "OK, primeiro recebemos uma string e, em seguida, ela passou pelo analisador, o que deu algo engraçado, você pode procurar lá. De qualquer forma, a coisa foi passada mais adiante ..."

Para isso, seria necessário um acoplamento desnecessário se o mecanismo de relatório de erros não fosse cidadão de primeira classe durante a fase de projeto. Acho que a maioria das pessoas acha muito trabalho para algo que não parece impressionante (quem gosta de dizer "Viu? Meu programa travou e a mensagem de erro é útil!").

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.