Header Ads

Afirmações, erros e falhas: qual é a diferença?

Shutterstock / SkillUp

Problemas do computador. Todos nós os temos, mais cedo ou mais tarde. Saber os detalhes de erros, afirmações, travamentos e muito mais é vital para entender mais sobre o problema em questão. Saiba tudo sobre isso.

O que é uma afirmação?

Quando um desenvolvedor começa a escrever código, eles logo apresentarão as instruções if nele. Uma instrução if é usada sempre que uma determinada condição precisa ser testada. Por exemplo, pode-se escrever um pseudocódigo if declaração da seguinte maneira:

 if (water_level > high_water_mark) then {raise_alert} 

Em outras palavras, se o nível da água ultrapassar a marca alta, um alerta será gerado. Mas talvez o sensor de água esteja quebrado, então atualizamos o código para corresponder:

 if (sensor_readout == nonsensical) then {raise_error fail} else {if (water_level > high_water_mark) then {raise_alert}} 

Ótimo, agora obteremos um erro e falharemos na rotina se sensor_readout for absurdo. E apenas se o valor provar ser sensato (devido à cláusula else — ou seja, o que fazer na situação oposta), prossiga com a verificação do nível_água em relação à marca_água alta.

No entanto, talvez alguém tenha desligado a alimentação do sensor. Podemos continuar assim por um tempo. Podemos cobrir todos os cenários possíveis imagináveis ​​e ainda perder alguns. Claro, poderíamos cobrir todas as situações possíveis com uma cláusula else correspondente e verificar se cada condição é comparada com outra, mas mesmo nesses casos, podemos ter perdido algumas combinações de variáveis.

Mesmo se tivéssemos apenas um conjunto limitado de variáveis ​​para trabalhar, o número de combinações possíveis em que um pacote de software pode se encontrar é bastante numeroso. E o que é mais, esses tipos de testes condicionais acontecem com bastante regularidade em quase todos os softwares.

Raciocinando um pouco mais sobre esse dilema, entendemos rapidamente que nós (como desenvolvedores) podemos (assim como todos os humanos cometem erros), mais cedo ou mais tarde, introduzir código que permite que o software seja executado em território indefinido. A variável x é definida com um valor específico, a variável y é atribuída a outro e não há provisão para isso no código.

Esta é precisamente a situação que uma declaração pode, até certo ponto, prever. Uma afirmação é outra condição (Pense nisso como outra instrução if.) Que afirma se uma determinada situação ímpar / incomum / não planejada / imprevista existe e geralmente lida com tal situação interrompendo o programa em vez de continuar a executar com um estado indefinido / desconhecido .

Embora a rede que o teste de ativo lançará ainda seja limitada à inteligência e habilidades do desenvolvedor que implementa a afirmação, uma afirmação pode muitas vezes ser mais ampla do que os limites limitados de instruções if testando o estado de várias variáveis, ou pode ser bastante específico para evitar certas situações perigosas.

Por exemplo, digamos que nosso pequeno sensor de água esteja montado em um tanque de chuva. A água, portanto, nunca deve ferver. Se nosso sensor de água tivesse um medidor de temperatura, no entanto, poderíamos ter certeza, mesmo que isso não acontecesse / nunca devesse acontecer. Vamos adicionar uma declaração ao pseudocódigo que começamos acima.

Em vez do ponto de ebulição (100 graus Celsius), verificaremos um máximo mais razoável de 70 graus Celsius, que ainda nunca deve ser alcançado quando se pensa em coletar água da chuva, pelo menos , Em nossa opinião. Lembre-se da palavra “ opinião ” pois isso se torna importante ao considerar a inteligência do desenvolvedor que implementa o assert. (Mais sobre isso abaixo).

 if (sensor_readout == nonsensical) then {raise_error fail} else {assert (water_temp < 70.0) {raise_assert_message fail exit} if (water_level > high_water_mark) then {raise_alert}} 

Escrevemos a declaração ao contrário. O código precisa afirmar que a temperatura da água é inferior a 70 graus Celsius. Se não for, ele executará o bloco de código, que gerará uma mensagem de assert, e o software falhará e será encerrado.

As declarações no código real são bastante semelhantes ao exemplo acima. Eles testam se uma determinada situação se aplica ou não e, subsequentemente, interrompem (ou travam de forma controlada) o programa / software em questão.

Freqüentemente, esses ativos são registrados nos arquivos de registro do aplicativo ou até mesmo diretamente na saída da tela. Revisá-los e / ou pesquisar por uma cópia da mensagem exata de afirmação em seu mecanismo de pesquisa favorito frequentemente (se o bug foi encontrado anteriormente) levará você a um relatório de bug no mesmo.

Mensagens de declaração geralmente são bugs, embora possam ser simplesmente bugs no raciocínio do desenvolvedor. Afinal, quem disse que daqui a 1.000 anos a chuva pode não ser mais quente do que 70 graus Celsius? (Esperemos que não, no entanto!)

Uma mensagem de declaração é a saída renderizada pela declaração introduzida pelos desenvolvedores no código — ou seja, a saída textual real gerada pelo software e conforme exibida na tela ou em os logs. Por exemplo, imagine esta mensagem de declaração sendo mostrada para o programa acima.

 Afirmar: (temperatura_da_água < 70): (88 < 70): falso 

Embora pareça um pouco enigmático (como algumas mensagens de declaração são), olhar um pouco mais de perto nos faz perceber que na segunda parte, water_temp foi trocado por 88 e que a saída é falsa (ou seja, a declaração de water_temp < 70 falhou porque a água estava a 88 graus e, portanto, a afirmação acionou a mensagem de afirmação). Sim, pode ficar um pouco confuso.

Armado com essas novas habilidades, depurar uma mensagem de afirmação da próxima vez que você vê-la se torna muito mais fácil. Você também pode achar mais fácil entender exatamente o que estava errado no momento da interrupção do aplicativo.

O que é um erro?

Erros de computação acontecem o tempo todo e por diversos motivos. Eles acontecem tanto no nível do desenvolvedor quanto no nível do usuário e em todas as etapas intermediárias. Por exemplo, um engenheiro de DevOps pode esquecer de incluir um arquivo necessário ou um signatário do pacote pode usar a chave errada para assinar o software e assim por diante.

Resumindo, um erro do computador pode ser definido como um problema com o hardware ou software do computador. Existem alguns exemplos de um erro, mesmo no pseudo-código limitado acima. Quando a condição sensor_readout == sem sentido é atendida, uma mensagem de erro é exibida.

Existem alguns erros que são mais comuns do que outros. Por exemplo, usar um caminho ou nome de arquivo incorreto é um erro comum. Problemas relacionados à energia (por exemplo, bateria fraca) também são erros bastante comuns.

Os erros são bastante separados e diferentes das mensagens de afirmação, embora a mensagem de afirmação em si possa ser vista como um erro, ou melhor, como uma situação indefinida agora coberta pela afirmação. Em geral, um erro de computador geralmente se traduz em “ Preciso de uma pessoa para consertar isso ” muito bem.

Conforme os computadores ficam mais inteligentes e a IA evolui, esperamos que menos erros sejam produzidos, embora ainda haja muito espaço para discussão e até mesmo argumentos nessa área.

O que é uma falha?

Uma pane no computador pode assumir várias formas. Todos nós estamos familiarizados com as telas azuis do Microsoft Windows, que tendem a acontecer quando um aplicativo apresenta um comportamento incorreto ou alguma parte central do sistema operacional ou o hardware da máquina falha.

Na maioria das vezes, no entanto, uma falha é um aplicativo de software que entrou em uma situação indefinida. Existem muitos desses cenários indefinidos possíveis. Um computador pode ter tentado gravar em uma área de RAM já em uso, prejudicando a si mesmo ou outro aplicativo, ou talvez tenha se deparado com um cenário em que tentou dividir por zero (o que é impossível), ou alguma situação semelhante.

Muitos sistemas operacionais escreverão um arquivo de despejo central (se estiver configurado), que permite que um desenvolvedor e, às vezes, um usuário final com alguma habilidade depure o problema em questão.

Se quiser saber mais sobre como depurar quando as coisas dão errado, incluindo a análise de arquivos de despejo de núcleo, provavelmente achará nosso artigo Depuração com GDB: Primeiros passos interessante.

Uma falha também pode ser o resultado de um aplicativo executando em uma situação indefinida, que não é tratada por um erro (a maneira mais leve de um aplicativo informar que algo está errado ) ou uma afirmação (um problema mais profundo, originalmente excluído pelo desenvolvedor como impossível, mas ainda está ocorrendo).

Além disso, observe que uma construção de programa para teste — ou seja, com informações de depuração (incluindo declarações somente no nível de depuração) incorporadas no binário de resultado final — pode travar ao produzir uma declaração, como é o caso , por exemplo, com o servidor MySQL.

Concluindo

Neste artigo, exploramos os conceitos de asserções, erros e travamentos, bem como como eles se relacionam. Vimos em profundidade como as afirmações podem parecer dentro do código e como isso se relaciona a um exemplo da vida real de monitoramento do nível e da temperatura da água com um sensor de água. Da próxima vez que você encontrar uma mensagem de asserção, dê uma olhada mais de perto e divirta-se com a depuração!

Nenhum comentário