Páginas

quarta-feira, 26 de outubro de 2011

Pérola: como dificultar o tratamento de erro de aplicações

Vamos dar uma olhada no método abaixo, que foi pego de uma situação real (mudei os nomes de variáveis para evitar que reclamem que o coloquei aqui). Nesta aplicação, há uma necessidade de sincronizar dados de usuários, buscando dados do sistema A e atualizando no sistema B.

public static void AtualizarUsuarios()
{
    try
    {
        using (BatchFacade batchFacade = new BatchFacade())
        {
            List<Usuario> usuariosSistemaA = batchFacade.ListarUsuariosSistemaA().GetRegistros<List<Usuario>>();
            List<Usuario> usuariosSistemaB = batchFacade.ListarUsuariosSistemaB().GetRegistros<List<Usuario>>();
            foreach (Usuario usuarioA in usuariosSistemaB)
            {
                Usuario usuarioB = usuariosSistemaA.Find(delegate(Usuario u)
                {
                    return u.SIAP.Equals(usuarioA.Codigo.ToString());
                });
                if (usuarioB != null && UsuarioModificado(usuarioA, ref usuarioB))
                {
                    batchFacade.AtualizarUsuario(usuarioB);
                }
            }
        }
    }
    catch
    {
        throw new ApplicationException("Falha ao atualizar os dados dos usuários");
    }
}

Esta aplicação possui um tratamento de erro genérico, que grava no eventlog todos os erros que ocorrem no sistema. Agora imaginem que ocorra um erro durante o processamento deste método: neste caso, a execução irá cair no block catch, e uma exception do tipo ApplicationException será lançada, com o texto "Falha ao atualizar os dados de usuários".
Agora imaginem vocês, com um erro em ambiente de produção, tendo apenas essa mensagem para descobrir o problema que está acontecendo. É nessas horas que a gente tem vontade de matar quem programa nas coxas, apenas se importando em entregar a funcionalidade e nem ligando para a pessoa que irá cuidar dessa tranqueira do sistema.

O simples fato de obter a exception original e passá-la como inner exception da ApplicationException que estamos lançando já ajuda, pois na rotina de tratamento de erros genérico podemos pegar os detalhes que ajudarão em muito identificar o problema. Neste caso, o problema era uma informação que vinha faltando no banco de dados.

[]'s

Nenhum comentário:

Postar um comentário