Alura > Cursos de Programação > Cursos de .NET > Conteúdos de .NET > Primeiras aulas do curso C# e Exceções: construa aplicações resilientes

C# e Exceções: construa aplicações resilientes

Conhecendo exceções - Apresentação

Olá! Sou o Daniel Artine e serei seu instrutor neste curso de .NET 8 utilizando C# e Exceptions.

Audiodescrição: Daniel é uma pessoa de pele clara, cabelos, olhos e barba castanhos-escuros. Usa uma camiseta preta e está sentado em uma cadeira gamer. Ao fundo, uma parede lisa com iluminação azul.

O projeto do curso será baseado na Adopet, um sistema para adoção de animais de estimação. O objetivo é permitir que pessoas cadastrem tanto animais disponíveis para adoção quanto tutores, ou seja, aquelas que se responsabilizam pela adoção.

Vamos trabalhar com os conceitos de animais, adoção e tutores dentro do sistema, mas sem nos aprofundarmos em relacionamentos de banco de dados ou tópicos avançados. Haverá algumas abstrações, porém nosso foco principal será nas exceções.

O curso demonstrará como o sistema funciona na prática, mostrando a interação das pessoas. Não abordaremos front-end ou apresentação visual, mas sim a lógica da API que sustenta o Adopet.

Lidaremos com uma API, incluindo conceitos de controladores e ações que já estarão praticamente desenvolvidas. Nosso objetivo será entender e aplicar conceitos de exceções: como lançar, o que são, como capturá-las e como evitar que erros inesperados comprometam a execução da aplicação.

Exploraremos a criação de exceções, tanto personalizadas quanto as exceções padrão do C#. Esperamos que você aproveite o conteúdo, pois aprenderemos muito sore o tratamento de exceções.

Até a primeira aula!

Conhecendo exceções - Provocando uma exceção

Para iniciarmos nosso projeto, vamos explorar brevemente do que ele se trata, discutir seu funcionamento e interagir para entender como a aplicação está operando atualmente.

Antes disso, é importante destacar que, se ainda não compreendemos o que é um controlador, o que é o ControllerBase, como se conecta a um banco de dados ou a função de determinadas anotações, recomendamos fortemente a realização dos cursos pré-requisitos.

Esse conhecimento é fundamental para que possamos absorver o conteúdo por completo e entender as questões de exceções no contexto de APIs.

Com os controladores já definidos, precisamos entender a função de cada um e como o sistema opera como um todo. Nosso sistema, chamado Adopet, é voltado para a adoção de animais de estimação e conta com os controladores AdocaoController(), PetController e TutorController.

Armazenamento de dados no SQLite

Esse é um sistema que permite o cadastro de tutores, pessoas interessadas em adotar, animais disponíveis e o gerenciamento das adoções. Todas essas informações são armazenadas no banco de dados SQLite, no arquivo Adocoes.db, que gerencia esses dados. A comunicação com o SQLite é feita por meio de uma connection string, responsável pela conexão com o banco.

Interagindo com a aplicação via Postman

Vamos executar a aplicação e utilizar o Postman para interagir com o sistema, já que estamos trabalhando com uma API sem front-end. Para isso, no VS Code, na barra de menu superior, clicamos em "Depurar > Iniciar sem depurar".

Abrimos o Postman nos permite enviar requisições de várias formas para a API. Para facilitar a interação, disponibilizamos uma coleção de requisições para importar no Postman, evitando a necessidade de copiar cada passo manualmente.

Para seguir os próximos passos é necessário que você crie uma conta e esteja logado. Feito isso, para importar, na barra de menu superior, clicamos em "Import".

Nisso abre uma janela para selecionar os arquivos e realizar a importação. Selecionamos o Adopet.postman-collection.json. Assim, conseguiremos interagir com a aplicação.

Cadastrando um tutor

Por exemplo, se quisermos cadastrar um tutor, acessamos Cadastrar Tutor. Nisso, encontramos a base de código abaixo.

{
    "nome": "João das Couves",
    "email": "email@example.com"
}

Para executar, clicamos no botão "Send" na lateral superior direita. Nisso, temos um status code 200, indicando que deu tudo certo.

Buscando todos os tutores cadastrados

Feito isso, acessamos o arquivo Buscar todos os tutores para fazermos um GET. Clicamos no botão "Send" e assim temos o retorno abaixo.

{ "id":1, "nome": "João das Couves", "email": "email@example.com" }

Cadastrando um animal

O mesmo procedimento se aplica ao cadastro de um animal. Acessamos o Cadastrar Pet, clicamos em "Select files > New file from local machine" e selecionamos uma imagem. Preenchemos também os campos de nome, idade, tipo e porte, e enviamos a requisição clicando em "Send".

Caso ocorra um problema, como um Bad Request, pode ser devido a uma perda de pacote. No entanto, ao reenviar a requisição, ela deve ser processada corretamente.

Buscando todos os animais cadastrados

Após, para fazermos um GET, acessamos o Buscar por todos os tutores e clicamos no botão "Send". Assim, temos o retorno abaixo:

[ { "id": 1, "nome": "Lua" "idade": 5, "tipo": 0, "adotado": false, "imagem": "833775f9-95df-465b-9c28-a49c5ba3997d.jpg" } ]

Solicitando a adoção de um animal

Se acessarmos o VS Code, na pasta "storage", temo a imagem "833775f9" referente a um gato.

Além disso, também podemos solicitar a adoção do animal de id 1, que é a "Lua" e o tutor de id 1, "João das Couves". Para isso, em Solicitar Adoção, clicamos em "Send".

{
    "idPet":1,
    "idTutor":1,
}

Adoção solicitada com sucesso!

Acompanhando e aprovando uma adoção

Assim, a solicitação entra em análise. Clicamos em Buscar todas as adoções e depois em "Send", assim, temos a informação abaixo:

[ { "id": 1, "tutor": "pet": 1, "motivo": "Um motivo qualquer", "status": 0, "justificativa": null } ]

Podemos, então, aprovar essa adoção acessando Aprovar adoção seguido de "Send".

{
    "idAdocao": 1
}

Feito isso, se voltarmos no GET de Buscar todas as adoções e clicarmos em "Send" o status passa a ser "1". Isso significa que foi aprovado.

No projeto temos os status 1 Aguardando avaliação, status 2 aprovado e 3 reprovado.

Conclusão e próximos passos

Se tentarmos realizar uma ação inválida, como solicitar a adoção de um animal inexistente, recebemos um erro 500 internal server error. Isso indica que houve um problema na atualização do banco de dados e a requisição não foi processada corretamente, resultando nesse erro.

Precisamos compreender o significado dessas informações e como elas são exibidas em uma aplicação .NET para facilitar a análise. Esse será o tema do próximo vídeo. Até lá!

Conhecendo exceções - Entendendo a pilha de execução

Para compreendermos melhor, disponibilizamos um projeto que usaremos apenas para visualizarmos o conceito de forma mais clara.

Esse projeto tem um método main que chama o Metodo1(), que chama o Metodo2(). No Metodo2(), é criado uma pessoa usuária chamada "Fulano", definida na classe Usuário no mesmo arquivo, e exibimos [Fim] - Metodo2.

Ao executar o projeto, o terminal exibe o retorno abaixo:

[Inicio] - Main

[Inicio] - Metodol

[Inicio] - Metodo2

Fulano

[Fim] - Metodo2

[Fim] - Metodol

[Fim] - Main

Isso acontece porque o código segue essa ordem: começamos com [Inicio] - Main, depois o Metodo1() que exibe o [Inicio] Metodo1, seguido por Metodo2() que exibe [Inicio] Metodo2. Após o usuário é criado e seu nome é exibido. Por fim o Metodo2() é finalizado, seguido do Metodo1(), até chegar à conclusão da main.

Conceito de pilha de execução - LIFO

Essas informações foram empilhadas. Esse conceito pode ser comparado a uma pilha de pratos, onde colocamos um prato sobre o outro e retiramos sempre o do topo.

O console, ao chamar a main, exibe [Inicio] - Main, depois chama o Metodo1(), que exibe [Inicio] - Metodo1, e em seguida o Metodo2(), que exibe [Inicio] - Metodo2 e "fulano". Após [Fim] - Metodo2, assim o Metodo2() sai da pilha, seguido pelo Metodo1() e, por fim, a main.

Esse conceito de pilha é chamado LIFO, Last In, First Out, onde o último elemento a entrar é o primeiro a sair. No nosso exemplo, o último a entrar foi o Metodo2() e o primeiro a sair também foi o Metodo2(). O primeiro a entrar foi o main e o último a sair também. Essa pilha de execução é o que determina a sequência de chamadas dos métodos na aplicação.

Quando ocorre um erro, a lógica se aplica da mesma forma. Vamos fazer um teste. Para isso, no VS Code, voltamos ao código do arquivo PilhaDeExecucao.cs.

Queremos provocar um erro. Para isso, na linha de código Usuario usuario, apagamos o trecho new Usuario("Fulano") e passamos null.

//Código omitido

Usuario usuario = null;

//Código omitido

Ao fazer isso, o próprio VS Code alerta que esse valor pode ser nulo. Ao executar o código, a main é executada, assim como o Metodo1 e Metodo2. Depois disso a execuçao é interrompida.

Aplicando o conceito no Postman

No Postman, acontece algo semelhante. No projeto Adopet, se analisarmos o fluxo de adoção, ao solicitar a adoção entramos no método que busca por um pet e um tutor e faz a adição no repositório.

Nesse caso, isso significa que o pet e o tutor podem ser nulos. Por exemplo, ao enviar um pet com um ID inexistente, ele não recupera a informação do banco, ocasionando um resultado nulo e impossibilitando a operação.

Próximos passos

Entendemos como a pilha se comporta tanto nos projetos de demonstração quanto na Adopet. Agora, podemos avançar para aprender como evitar que isso aconteça com a pilha e gerenciar a aplicação de modo que ela não seja encerrada inesperadamente.

Esse tema será abordado nos próximos vídeos. Até mais!

Sobre o curso C# e Exceções: construa aplicações resilientes

O curso C# e Exceções: construa aplicações resilientes possui 108 minutos de vídeos, em um total de 44 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas