Nancy – tratamento de erros (onError hook)

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Em nosso último post sobre o Nancy, falamos como fazer tratamentos antes e depois de um request, e prometemos falar sobre como fazer tratamento de erros, e é justamente o que vamos ver hoje aqui.

Vamos criar uma aplicação web com o template em branco e utilizando o framework 4.6.1 no Visual Studio, da mesma forma como fizemos nos demais posts sobre o Nancy aqui no blog, e após sua criação, vamos instalar o pacote do Nancy utilizando o Nuget:

Install-Package Nancy

Como host vamos utilizar o ASP.NET, então, instale também o pacote abaixo:

Install-Package Nancy.Hosting.Aspnet

Agora, vamos criar uma classe com o nome HelloNancy com o código abaixo:

using Nancy;
using System;

namespace NancyError
{
    public class HelloNancy : NancyModule
    {
        public HelloNancy()
        {
            Get["/"] = p => "Hello Ninja";
            Get["/soma/{valor1:int}/{valor2:int}"] = p => $"{p.valor1} + {p.valor2} = {Soma(p.valor1, p.valor2)}";
        }

        private dynamic Soma(int valor1, int valor2)
        {
            ValidarValor(valor1);
            ValidarValor(valor2);
            return valor1 + valor2;
        }

        private void ValidarValor(int valor)
        {
            if (valor < 0)
                throw new Exception("O valor não pode ser negativo");
        }
    }
}

O que fizemos aqui foi criar nossa aplicação Nancy, que faz a soma de dois valores, e incluímos uma validação para só aceitarmos valores maiores ou iguais a zero. Pois bem, rode nossa aplicação e digite o endereço abaixo no browser:

http://localhost:50330/soma/10/20

Você deverá receber como retorno a mensagem “10 + 20 = 30”.

Agora, digite no browser o endereço abaixo:

http://localhost:50330/soma/10/-20

Como resultado nós recebemos um hmtl de erro do Nancy, com um erro 500 – Internal server error, contendo o stack trace de nossa exceção. Existem situações que queremos tratar como o erro será enviado à aplicação cliente ou ao browser, assim como também pode ser interessante fazermos alguma ação quando um erro ocorrer, como por exemplo gerar um log no banco de dados. Agora vamos ver como fazemos esse tratamento com o Nancy, e assim como tudo no Nancy, é bastante simples. Para isso, basta adicionarmos dentro do construtor da classe o hook OnError conforme abaixo:

OnError += (ctx, ex) =>
{
	return $"Ocorreu um erro na aplicação: {ex.Message}";
};

Agora execute a aplicação, passe novamente um valor negativo como parâmetro e veja o resultado, não recebemos mais a página de erro do Nancy, e recebemos apenas uma mensagem dizendo “Ocorreu um erro na aplicação: O valor não pode ser negativo”. O hook recebe dois parâmetros, o contexto, e também temos acesso à exceção que foi capturada.

Simples e fácil não? Nós podemos usar o hook OnError para fazer diversos tipos de tratamento, gerar logs, alterar o retorno, mudar o código de erro, etc.

Ainda veremos mais posts sobre o Nancy por aqui, fique ligado. Segue abaixo o código completo de nosso exemplo:

using Nancy;
using System;

namespace NancyError
{
    public class HelloNancy : NancyModule
    {
        public HelloNancy()
        {
            OnError += (ctx, ex) =>
            {
                return $"Ocorreu um erro na aplicação: {ex.Message}";
            };

            Get["/"] = p => "Hello Ninja";
            Get["/soma/{valor1:int}/{valor2:int}"] = p => $"{p.valor1} + {p.valor2} = {Soma(p.valor1, p.valor2)}";
        }

        private dynamic Soma(int valor1, int valor2)
        {
            ValidarValor(valor1);
            ValidarValor(valor2);
            return valor1 + valor2;
        }

        private void ValidarValor(int valor)
        {
            if (valor < 0)
                throw new Exception("O valor não pode ser negativo");
        }
    }
}

Quase 20 anos de experiência no mercado de TI.
Atuação em grandes empresas como Netshoes, Borland, JBS, Bradesco, Hospital das Clínicas, Rede, Prodam, HSPE, Instituto Ayrton Senna, e também em empresas internacionais como Delta Dental, T-Mobile, Pepsi e Mckesson.
Fundador da TecPrime Solutions, administrador da comunidade nopCommerce Brasil, e autor dos sites InvestFacil.net e Desenvolvedores.ninja

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *