Por que muitas mensagens de exceção não contêm detalhes úteis?

220

Parece que há uma certa concordância de que as mensagens de exceção devem conter detalhes úteis .

Por que muitas exceções comuns dos componentes do sistema não contêm detalhes úteis?

Alguns exemplos:

  • NET Listacesso de índice ArgumentOutOfRangeExceptionque não me dizer o valor do índice que foi julgado e era inválida, nem me diga o intervalo permitido.
  • Basicamente, todas as mensagens de exceção da biblioteca padrão do MSVC C ++ são totalmente inúteis (na mesma linha acima).
  • Exceções do Oracle no .NET, informando (parafraseado) "TABLE OR VIEW não encontrado", mas não qual .

Então, para mim, parece que na maioria das vezes as mensagens de exceção não contêm detalhes suficientes para serem úteis. Minhas expectativas estão fora de linha? Estou usando exceções erradas para perceber isso? Ou talvez a minha impressão é errada: a maioria das exceções que realmente fornecer detalhes úteis?

Martin Ba
fonte
59
Deve-se notar que, do lado dos profissionais de segurança, "as mensagens de erro não devem conter detalhes sobre os componentes internos do sistema" é uma regra prática.
Telastyn
118
@Telastyn: Somente se o seu sistema estiver aberto para atacantes. Se você estiver executando um servidor da Web, por exemplo, deseja enviar mensagens de erro sem graça ao usuário final, mas ainda deseja que mensagens de erro muito detalhadas sejam registradas no seu final. E no software do cliente, onde o usuário não é um invasor, você definitivamente deseja que essas mensagens de erro sejam o mais detalhadas possível, para que, quando algo der errado e você receber um relatório de erro, tenha tanta informação para trabalhar. quanto possível, porque muitas vezes é tudo o que você recebe.
Mason Wheeler
9
@ Snowman: O que é inacessível para o usuário se for um software do lado do cliente? O proprietário da máquina é dono da máquina e pode chegar a qualquer coisa.
Mason Wheeler
6
Sempre há algumas informações adicionais que você gostaria de ter. Acho que as mensagens que você dá como exemplo são bastante boas. Você pode depurar o problema com eles. Muito melhor que o "erro 0x80001234" (exemplo inspirado no Windows Update).
usr

Respostas:

204

As exceções não contêm detalhes úteis porque o conceito de exceções ainda não amadureceu na disciplina de engenharia de software; muitos programadores não as entendem completamente e, portanto, não as tratam adequadamente.

Sim, IndexOutOfRangeExceptiondeve conter o índice preciso que estava fora do intervalo, bem como o intervalo válido no momento em que foi lançado, e é desprezível em nome dos criadores do tempo de execução do .NET que não. Sim, a table or view not foundexceção da Oracle deve conter o nome da tabela ou exibição que não foi encontrada e, novamente, o fato de não existir é desprezível em nome de quem é responsável por isso.

Em grande parte, a confusão decorre da idéia original equivocada de que as exceções devem conter mensagens legíveis por humanos, que, por sua vez, decorrem da falta de compreensão do que são essas exceções; portanto, é um ciclo vicioso.

Como as pessoas pensam que a exceção deve conter uma mensagem legível por humanos, elas acreditam que qualquer informação transmitida pela exceção também deve ser formatada na mensagem legível por humanos e, em seguida, ficam entediadas em escrever todas as mensagens legíveis por humanos - código de construção, ou eles temem que isso possa estar divulgando uma quantidade desaconselhável de informações para qualquer olhar curioso que possa ver a mensagem. (Os problemas de segurança mencionados por outras respostas.)

Mas a verdade é que eles não devem se preocupar com isso, porque a exceção não deve conter uma mensagem legível por humanos. Exceções são coisas que somente os programadores devem ver e / ou lidar. Se houver a necessidade de apresentar informações de falha a um usuário, isso deve ser feito em um nível muito alto, de maneira sofisticada e no idioma do usuário, que, estatisticamente falando, é improvável que seja inglês.

Portanto, para nós programadores, a "mensagem" da exceção é o nome da classe da exceção , e qualquer outra informação pertinente à exceção deve ser copiada nas variáveis ​​de membro (final / somente leitura) do objeto de exceção. De preferência, cada pedacinho concebível disso. Dessa forma, nenhuma mensagem precisa (ou deve) ser gerada e, portanto, nenhum olhar curioso pode vê-la.

Para abordar a preocupação expressa por Thomas Owens em um comentário abaixo:

Sim, claro que, em algum nível, você vai criar uma mensagem de log sobre a exceção. Mas você já vê o problema do que está dizendo: por um lado, uma mensagem de log de exceção sem rastreamento de pilha é inútil, mas, por outro lado, não deseja permitir que o usuário veja todo o rastreamento de pilha de exceção. Novamente, nosso problema aqui é que nossa perspectiva é distorcida pelas práticas tradicionais. Os arquivos de log tradicionalmente estão em texto simples, o que pode ter sido bom enquanto nossa disciplina ainda estava em sua infância, mas talvez não mais: se houver um problema de segurança, o arquivo de log deverá ser binário e / ou criptografado.

Seja binário ou texto sem formatação, o arquivo de log deve ser considerado como um fluxo no qual o aplicativo serializa as informações de depuração. Esse fluxo seria apenas para os olhos dos programadores, e a tarefa de gerar informações de depuração para uma exceção deve ser tão simples quanto serializar a exceção no fluxo de log de depuração. Dessa forma, observando o log, você verá o nome da classe de exceção (que, como já afirmei, é para todos os fins práticos "a mensagem"), cada uma das variáveis ​​de membro de exceção que descrevem tudo o que é pertinente. e prático de incluir em um log e todo o rastreamento de pilha. Observe como a formatação de uma mensagem de exceção legível por humanos está conspicuamente ausente desse processo.

PS

Mais alguns dos meus pensamentos sobre esse assunto podem ser encontrados nesta resposta: Como escrever uma boa mensagem de exceção

PPS

Parece que um monte de pessoas estavam sendo incomodada por minha sugestão sobre arquivos de log binário, então eu alterada a resposta, mais uma vez para torná-lo ainda mais claro que o que eu estou sugerindo aqui é não que o arquivo de log deve ser binário, mas que o arquivo de log pode ser binário, se necessário.

Mike Nakis
fonte
4
Examinei algumas das classes de exceção no .NET Framework e, por fim, existem muitas oportunidades para adicionar esse tipo de informação programaticamente. Então, acho que a pergunta resolve "por que não". Mas +1 para toda a coisa "legível por humanos".
22715 Robert Harvey
7
Não concordo que as exceções não devam conter um componente legível por humanos. Em algum nível, convém criar uma mensagem de log referente à exceção. Eu argumentaria que o registro de um rastreamento de pilha em um arquivo de log legível pelo usuário está expondo os detalhes de implementação que você não deseja expor, portanto a mensagem legível por humanos deve ser registrada. Quando apresentados ao arquivo de log que contém o erro, os desenvolvedores devem ter um ponto de partida para iniciar sua depuração e poder forçar a exceção. O componente legível por humanos deve ser adequadamente detalhado sem abrir mão da implementação.
Thomas Owens
44
então os programadores não são humanos? Olhando para os meus colegas esta confirma algumas suspeitas que tive há algum tempo ...
gbjbaanb
51
Novamente, não há nada de errado em permitir que o usuário veja o rastreamento inteiro da pilha , desde que o software seja do lado do cliente. Todo projeto de software profissional em que eu já trabalhei, e a maioria dos amadores também, continha um sistema de registro que geraria um dump de erro completo quando uma exceção não tratada fosse gerada, incluindo rastreamentos de pilha completa de todos os threads atualmente em execução no processo. E o usuário pode (suspirar, oh horror!) Olhar para ele a qualquer momento, pois isso é necessário (não apenas útil, mas necessário ) para enviar a mensagem de erro de volta para nós! O que há de errado com isso?
Mason Wheeler
13
Também não estou convencido com relação aos arquivos de log apenas binários . Principalmente por causa da minha experiência com o systemd. Sua ferramenta especial para visualizar esses registros é bastante confusa e parece ter sido projetada por um comitê de macacos de Shakespeare. Considere que, para um aplicativo Web, a primeira pessoa a ver sua exceção geralmente será o administrador do sistema e ele desejará determinar se é algo que ele precisa corrigir (por exemplo, o disco ficou sem espaço) ou repassar para os desenvolvedores.
Michael Hampton
46

Por que muitas exceções comuns dos componentes do sistema não contêm detalhes úteis?

Na minha experiência, existem várias razões pelas quais as exceções não contêm informações úteis. Espero que esse tipo de razão também se aplique aos componentes do sistema - mas não tenho certeza.

  • As pessoas focadas na segurança veem as exceções como uma fonte de vazamento de informações (por exemplo ). Como o comportamento padrão das exceções é exibir essas informações para o usuário, os programadores às vezes erram com cautela.
  • Em C ++, ouvi argumentos contra a alocação de memória em blocos catch (onde pelo menos parte do contexto para gerar boas mensagens). Essa alocação é difícil de gerenciar e, pior ainda, pode causar uma exceção de falta de memória - geralmente travando seu aplicativo ou vazando memória. É difícil formatar exceções sem alocar memória, e essa prática pode ter migrado entre idiomas, como fazem os programadores.
  • Eles não sabem. Quero dizer, não são cenários em que o código tem nenhuma ideia o que deu errado. Se o código não souber - não pode lhe dizer.
  • Já trabalhei em locais onde as preocupações com a localização impediam a inserção de apenas seqüências de caracteres em inglês no sistema - mesmo em exceções que seriam lidas apenas pela equipe de suporte em inglês.
  • Em alguns lugares, vi exceções usadas mais como declarações. Eles estão lá para fornecer uma mensagem clara e alta durante o desenvolvimento de que algo não foi feito ou que uma alteração foi feita em um lugar, mas não em outro. Geralmente, eles são únicos o suficiente para que uma boa mensagem seja duplicada ou simplesmente confusa.
  • As pessoas são preguiçosas, os programadores são mais do que a maioria. Passamos muito menos tempo no caminho excepcional do que no caminho feliz, e esse é um efeito colateral.

Minhas expectativas estão fora de linha? Estou usando Exceções erradas que até percebo isso?

Meio? Quero dizer, as exceções devem ter boas mensagens, mas também são exceções . Você deve gastar seu tempo projetando código para evitar condições excepcionais ou escrevendo código para lidar com condições excepcionais (ignorando a mensagem), não os utilizando como uma espécie de mecanismo de feedback interativo ao codificar. É inevitável usá-los para fins de depuração, mas na maioria das situações isso deve ser mantido no mínimo. O fato de você perceber esse problema me preocupa que você não esteja fazendo um trabalho bom o suficiente para evitá-los.

Telastyn
fonte
Sei que isso foi marcado como C, mas devo acrescentar que seu último parágrafo não se aplica a todos os idiomas, já que alguns podem (com ou sem razão) confiar muito no tratamento e relatório de erros com base em exceções .
Lilienthal
11
@ Lilienthal - como? Nenhum idioma com o qual estou familiarizado faz esse tipo de coisa regularmente.
Telastyn 13/04
11
Acho que essa resposta tem muito conteúdo bom, mas evita dizer a linha inferior, que é "Eles deveriam".
precisa saber é o seguinte
3
Obrigado. Sua preocupação é infundada (espero :-). Mas toda vez que passo um minuto extra rastreando o que deu errado nesse teste de unidade ou passo um tempo extra analisando o código porque o arquivo de log está sem informações, fico um pouco irritado com a evitabilidade evitável de algumas mensagens :-)
Martin Ba
@Telastyn O ABAP proprietário da SAP tem uma construção de classe de exceção que pode conter uma mensagem, que é basicamente um objeto especificamente destinado a relatar o estado do programa (sucesso, falha, aviso) ao usuário junto com uma mensagem dinâmica (multilíngue). Admito que não sei o quão difundido esse tipo de coisa é, ou se é encorajado nas línguas, se possível, mas há pelo menos um em que é (infelizmente) prática comum.
Lilienthal
12

Eu não tenho excesso de experiência em C # ou especificamente em C ++, mas posso lhe dizer isso - as exceções escritas pelo desenvolvedor 9 em 10 vezes são mais úteis do que qualquer exceção genérica que você encontrará, ponto final.

Idealmente, sim, uma exceção genérica indicará exatamente por que o erro ocorreu e você poderá corrigi-lo com facilidade - mas de maneira realista, em aplicativos grandes com várias classes que podem gerar uma ampla variedade de tipos diferentes de exceções ou o Mesmo tipo de exceções, é sempre mais valioso gravar sua própria saída para retorno de erro do que confiar na mensagem padrão.

É assim que deve ser, porque, como muitas pessoas apontaram, alguns aplicativos não desejam lançar uma mensagem de erro que não desejam que o usuário veja, por motivos de segurança ou para evitar confundi-los.

Em vez disso, você deve prever em seu design quais tipos de erros podem ser gerados no seu aplicativo (e sempre haverá erros) e escrever mensagens de captura de erros que o ajudarão a identificar o problema.

Isso nem sempre ajudará você - porque você nem sempre pode prever qual mensagem de erro será útil - mas é o primeiro passo para entender melhor seu próprio aplicativo a longo prazo.

Zibbobz
fonte
7

A questão está perguntando especificamente por que tantas exceções geradas por "componentes do sistema" (também conhecidas como classes de biblioteca padrão) não contêm detalhes úteis.

Infelizmente, a maioria dos desenvolvedores não grava os componentes principais nas bibliotecas padrão, nem os documentos detalhados do projeto ou outras justificativas do projeto são necessariamente tornados públicos. Em outras palavras, talvez nunca tenhamos certeza.

No entanto, há dois pontos principais a serem lembrados sobre o motivo pelo qual as informações detalhadas das exceções podem não ser desejáveis ​​ou importantes:

  1. Uma exceção pode ser usada chamando código de qualquer maneira: uma biblioteca padrão não pode restringir a maneira como a exceção é usada. Especificamente, ele pode ser exibido para o usuário. Considere um índice de matriz fora dos limites: isso pode fornecer informações úteis a um invasor. O designer de idiomas não tem idéia de como um aplicativo usará a exceção lançada ou mesmo que tipo de aplicativo é (por exemplo, aplicativo Web ou desktop); portanto, deixar de fora as informações pode ser mais segura do ponto de vista da segurança.

  2. Exceções não devem ser exibidas para o usuário. Em vez disso, exiba uma mensagem de erro amigável e registre a exceção em um local que um invasor não tem acesso (se aplicável). Depois que o erro é identificado, o desenvolvedor deve depurar o código, inspecionando os quadros da pilha e os caminhos lógicos. Neste ponto, o desenvolvedor tem mais informações do que uma exceção jamais poderia ter.


fonte
3
1. Com base nesse critério, parece relativamente arbitrário o que são informações ("Índice fora do intervalo", rastreamento de pilha) e não (valor do índice) exibidas. 2. A depuração pode potencialmente ser muito mais rápida e fácil quando valores dinâmicos relevantes são conhecidos. Por exemplo, muitas vezes dizer-lhe imediatamente se o problema é a entrada de lixo para a parte do código que falhou, ou que o código não lidar corretamente com boa entrada
Ben Aaronson
@BenAaronson a identidade / classe da exceção nos diz o tipo de erro. Meu argumento é que os detalhes podem ser omitidos (ou seja, qual valor específico causou o erro) por segurança. Esse valor pode ser rastreável até a entrada do usuário, revelando informações para um invasor.
@ Snowman: Eu dificilmente acho que a segurança é uma consideração quando um rastreamento de pilha completa está disponível e o número do índice não. Claro que eu entendo um atacante sondagem para estouros de buffer, mas muitas exceções deixar de fora dados bastante seguro também (por exemplo, qual a tabela Oracle não foi encontrado)
gbjbaanb
@gbjbaanb quem disse que precisamos mostrar o rastreamento da pilha completa para o usuário?
11
Obrigado por compartilhar esse insight. Pessoalmente, não concordo e acho que o argumento de segurança é uma falácia completa, mas pode ser uma justificativa.
Martin Ba
4

Primeiro, deixe-me estourar uma bolha dizendo que, mesmo que a mensagem diag seja carregada com informações que o levem à linha de código exata e ao subcomando em 4 segundos, é provável que os usuários nunca anotem ou transmitam para o pessoal de suporte e você será informado "Bem, isso disse algo sobre uma violação ... eu não sei, parecia complicado!"

Estou escrevendo software e dando suporte aos resultados de outros softwares há mais de 30 anos e, pessoalmente, a qualidade atual de uma mensagem de exceção praticamente não tem nada a ver com segurança, independentemente de como os resultados finais se ajustaram ao modelo deles. o universo, muito mais a ver com o fato de que muitos em nossa indústria eram originalmente autodidatas, e eles nunca incluíam lições de comunicação. Talvez se forçássemos todos os novos codificadores em uma posição de manutenção por alguns anos, nos quais eles precisariam lidar com o que havia de errado, eles entenderiam a importância de pelo menos alguma forma de precisão.

Recentemente, em um aplicativo sendo reconstruído, foi tomada uma decisão de que os códigos de retorno se enquadrariam em um dos três grupos:

  • 0 a 9 seria sucesso através do sucesso com informações adicionais.
  • 10 a 99 seriam erros não fatais (recuperáveis) e
  • 101 a 255 seriam erros fatais.

(100 foi excluído por algum motivo)

Em qualquer fluxo de trabalho específico, nosso pensamento foi reutilizado ou o código genérico usaria retornos genéricos (> 199) para erros fatais, deixando-nos 100 erros fatais possíveis para um fluxo de trabalho. Com alguns dados diferenciadores na mensagem, todos os erros como o arquivo não encontrado podem usar o mesmo código e diferenciar-se pelas mensagens.

Quando o código voltou dos contratados, você não acreditaria em nossa surpresa quando praticamente TODO O ERRO FATAL ÚNICO fosse o código de retorno 101.

Tudo o que considero que acho que a resposta para sua pergunta é que as mensagens são tão sem sentido porque, quando criadas originalmente, deveriam ser espaços reservados aos quais ninguém voltou. Eventualmente, as pessoas descobriram como corrigir problemas, não por causa das mensagens, mas DISPITE-AS.

Desde aquela época, o pessoal autodidata simplesmente nunca teve um bom exemplo do que uma exceção deveria conter. Acrescente a isso que mais usuários não leem as mensagens, muito menos tentam repassá-las para o suporte (vi mensagens de erro que foram recortadas e coladas pelos usados ​​que foram depois editadas antes de serem enviadas com o comentário posterior de que parecia muita informação e eu não poderia querer tudo, então eles removeram aleatoriamente um monte delas.

E vamos enfrentá-lo, com muitos (não todos, mas muitos) da próxima geração de codificadores, se for mais trabalhoso e não adicionar flash, apenas não vale a pena ...

Última observação: se uma mensagem de erro incluir um código de erro / retorno, parece-me que em algum lugar dos módulos executados deve haver uma linha que lê algo como "se a condição retornar código-valor" e a condição deve informar por que o código de retorno ocorreu. Parece uma abordagem lógica simples, mas, para a minha vida, apenas tente que a Microsoft conte o que aconteceu quando uma atualização do Windows falhou no CODE 80241013 ou em algum outro identificador muito exclusivo. Meio triste, não é?

Randy
fonte
8
"... você não acreditaria em nossa surpresa quando praticamente TODO O ÚNICO ERRO FATAL fosse o código de retorno 101." Você está certo. Eu não acreditaria que você ficou surpreso quando o contratado seguiu suas instruções.
Odalrick
3
chances are the users will never write it down... and you will be told "Well it said something about a violation..." É por isso que você usa uma ferramenta de log de exceção para gerar automaticamente o relatório de erro contendo o rastreamento de pilha e possivelmente até enviá-lo ao seu servidor. Eu tive um usuário uma vez que não era muito técnico. Toda vez que ela enviava uma mensagem do registrador de erros, era algo como "Não sei o que fiz de errado, mas ...", não importa quantas vezes expliquei que esse erro significava que o bug estava do meu lado . Mas sempre recebi os relatórios de erros dela!
Mason Wheeler
3

Embora eu concorde que as exceções devem conter o máximo de informações possível, ou pelo menos ser menos genérico. No caso da tabela não encontrada, o nome da tabela seria bom.

Mas você sabe mais sobre o que estava tentando fazer no local do código em que recebeu a exceção. Embora muitas vezes você realmente não possa fazer muito para corrigir a situação quando algo der errado em uma biblioteca fora do seu controle, você poderá adicionar informações muito mais úteis sobre a situação em que algo deu errado.

No caso de tabela não encontrada, isso não ajudará muito se você for informado de que a tabela que não pode ser encontrada se chama STUDENTS, porque você não possui uma tabela e essa string não está em nenhum lugar do seu código.

Mas se você pegar a exceção e a repetir novamente com a instrução SQL que estava tentando executar, ficará melhor, pois você tentou inserir um registro com o campo de nome Robert '); ESTUDANTES DA TABELA DE GOTA; (Sempre existe um xkcd!)

Portanto, para combater as exceções menos informativas: tente pegar e relançar com mais informações específicas do que você estava tentando fazer.

Provavelmente devo acrescentar, para que seja mais uma resposta do porquê da pergunta, que uma provável razão pela qual o foco dos criadores das bibliotecas não tenha sido o de melhorar as mensagens de exceção é que eles não sabem por que algo foi tentado que falhou, essa lógica está no código de chamada.

Bent
fonte
por exemplo, em C ++, você deve usar throw_with_nestedmuito.
Route de milhas
3

Para dar uma resposta um pouco diferente: O código incorreto provavelmente foi feito para especificar:

  • A função recebe X e retorna Y
  • Se X for inválido, lance a exceção Z

Adicione a pressão para entregar exatamente as especificações (por medo de ser rejeitado em revisão / teste) em tempo mínimo e com o mínimo de confusão, e você terá sua receita para uma exceção de biblioteca totalmente compatível e inútil.

Stu Pegg
fonte
3

As exceções têm um custo específico ao idioma e à implementação.

Por exemplo, são necessárias exceções em C ++ para destruir todos os dados vivos entre o quadro de chamada de lançamento e o quadro de captura de chamada, e isso é caro. Portanto, os programadores não desejam usar muito as exceções.

No Ocaml, o lançamento de exceções é quase tão rápido quanto um C setjmp(seu custo não depende do número de quadros de chamadas atravessadas), para que os desenvolvedores possam usá-lo muito (mesmo em casos não excepcionais, muito comuns). Por outro lado, as exceções do C ++ são pesadas o suficiente, então você provavelmente não as usará como no Ocaml.

Um exemplo típico é uma pesquisa ou exploração recursiva que pode ser "interrompida" dentro de uma recursão bastante profunda (por exemplo, encontre uma folha em uma árvore ou uma função de unificação). Em alguns idiomas, é mais rápido (mais idiomático) propagar essa condição para todos os chamadores. Em outros idiomas, lançar uma exceção é mais rápido.

Portanto, dependendo do idioma (e dos hábitos dos desenvolvedores), uma exceção pode conter muitos detalhes úteis ou, pelo contrário, ser usada como um salto não local rápido e apenas os dados muito úteis.

Basile Starynkevitch
fonte
6
"Por exemplo, são necessárias exceções em C ++ para destruir todos os dados vivos entre o quadro de chamada de lançamento e o quadro de captura de chamadas, e isso é caro. Portanto, os programadores não desejam usar muito as exceções." Porcaria total. A principal força das exceções do C ++ é que os destruidores são chamados deterministicamente. Ninguém os usaria se apenas pulassem.
Route de milhas
Eu sei disso, mas é um fato que as exceções do C ++ não são como o Ocaml e você não as usa como no Ocaml.
Basile Starynkevitch
5
Você não usa exceções C ++ para o fluxo de controle em C ++ principalmente porque isso torna o código ilegível e difícil de entender.
Miles Rout
-2

O que faz você pensar que o valor do índice, o intervalo necessário ou o nome da tabela são um detalhe útil, por uma exceção?

Exceções não são um mecanismo de tratamento de erros; eles são um mecanismo de recuperação .

O ponto das exceções é aumentar o nível de código que pode lidar com a exceção. Onde quer que esse nível esteja, você tem as informações necessárias ou elas não são relevantes. Se houver informações de que você precisa, mas não possui acesso imediato , você não está manipulando a exceção no nível apropriado.

A única vez em que consigo pensar em onde informações extras podem ser úteis é no nível superior absoluto do seu aplicativo, onde você trava e emite um erro de despejo; mas não é o trabalho da exceção acessar, compilar e armazenar essas informações.

Não estou dizendo que você pode colocar "lançar nova exceção" em todos os lugares e chamar de bom, é possível escrever exceções ruins. Mas incluir informações irrelevantes não é necessário para usá-las adequadamente.

Odalrick
fonte
Eu não descreveria o nome da tabela de banco de dados ausente como irrelevante, apesar de entender e simpatizar com o argumento que você está fazendo. Eu lhe dei um voto positivo.
precisa saber é o seguinte
11
@DanielHollinrake Sim, o nome da tabela é definitivamente o menos irrelevante dos exemplos. No código com o qual trabalho, esse tipo de problema é deprimente e comum, e observar como o nome da tabela foi mutilado fornece pistas sobre o que está errado. Eu tenho tentado pensar em um exemplo por que essas coisas são irrelevantes para a exceção; talvez eu possa usar isso ...
Odalrick 20/04/2015
Discordo. Para lidar com uma exceção, detalhes adicionais podem não ser necessários, pois você só deseja proteger o aplicativo contra falhas, mas, finalmente, você precisará dizer por que ele não funcionou e conseguir corrigi-lo. Se você não tiver nenhuma pista, mas o tipo de exceção, é recomendável depurar.
precisa saber é o seguinte
@ t3chb0t É para isso que o rastreamento de pilha e a classe da exceção e do dump de memória e tudo o mais servem. Como ele iria ajudar você , se um cliente liga e diz "O computador me diz que que tentou acessar índice 5 e ela não estava lá.". Só poderia ajudar se você também serializar a lista, o contexto da lista e qualquer outra coisa que possa ser útil. Você não deve serializar todo o estado do aplicativo toda vez que lançar uma exceção.
Odalrick 4/11/15
@Odalrick para o cliente pode não ter nenhum significado, mas como desenvolvedor eu valorizo ​​todas as informações que posso obter ;-) então talvez outro exemplo: digamos que ocorra uma SqlExeption e isso é tudo que você sabe ... É muito mais fácil repará- lo se você souber qual seqüência de conexão, banco de dados ou tabela, etc. não funcionou ... e isso é ainda mais importante se o seu aplicativo usar vários bancos de dados. Um rastreamento de pilha detalhado requer que os arquivos pdb sejam enviados com o aplicativo ... nem sempre é possível. Também os despejos de memória podem se tornar muito grandes e nem sempre podem ser transferidos.
t3chb0t