none
Tratamento de Erro RRS feed

  • Pergunta

  • Boa noite,

    Preciso tratar um erro e de tal modo que o programa continue o fluxo a partir da linha que gerou o erro, ou seja, que o programa não pare de ler o arquivo que está tentando ler por causa de uma linha. O programa precisa registrar no log o erro ocorrido, na linha do .txt que ocorreu e continuar lendo as outras linhas, porém não estou conseguindo fazer isso.

    Tentei usar o bloco try, catch e finally para resolver o problema mencionado, porém quando entra no catch o programa segue o fluxo a partir do catch e não executa o finally. Não estou conseguindo identificar onde estou cometendo erro(além do fato de eu ser juninho em programação).

    Veja o código abaixo:

    List<Cliente> colClient = new List<Cliente>();
    
                Stream entrada = File.Open(caminho, FileMode.Open);
                StreamReader leitor = new StreamReader(entrada);
                //StreamReader leitor = new StreamReader(entrada,System.Text.Encoding.UTF8);
                string linha = leitor.ReadLine();
                while (linha != null)
                {
                    var cliente = new Cliente();
                    var aux = linha.Split(';');
    
                    try
                    {
                        cliente.IdentificadorERP = new Guid(aux[0]);
                        cliente.Nome = aux[1];
                        cliente.DataNascimento = Convert.ToDateTime(aux[2]);
                        cliente.Regiao =aux[3];
                        cliente.Pontos = Convert.ToInt32(aux[4]);
    
                        colClient.Add(cliente);
                        linha = leitor.ReadLine();
                    }
                    catch (System.FormatException)
                    {
                        throw new LinhaInvalidaException(linha);
                    }
                    finally
                    {
                        colClient.Add(cliente);
                        linha = leitor.ReadLine();
                    }
                }
                leitor.Close();
                entrada.Close();
    
                return colClient;

    Alguém mais experiente poderia me ajudar com este problema?


    domingo, 15 de julho de 2018 23:15

Respostas

  • Géberson, bom dia!

    O problema do código é porque no bloco catch, está sendo enviado uma nova exception. Ela quebra o fluxo do programa, pois sai do while.

    Quando uma exception sem tratamento é acionada, o .NET envia para a stack (métodos) acima. Pense em resolver da seguinte maneira

    List<Cliente> colClient = new List<Cliente>();
    
    Stream entrada = File.Open(caminho, FileMode.Open);
    using (StreamReader leitor = new StreamReader(entrada))
    {
        //StreamReader leitor = new StreamReader(entrada,System.Text.Encoding.UTF8);
        string linha = leitor.ReadLine();
        while (linha != null)
        {
            var cliente = new Cliente();
            var aux = linha.Split(';');
    
            try
            {
                cliente.IdentificadorERP = new Guid(aux[0]);
                cliente.Nome = aux[1];
                cliente.DataNascimento = Convert.ToDateTime(aux[2]);
                cliente.Regiao = aux[3];
                cliente.Pontos = Convert.ToInt32(aux[4]);
    
                colClient.Add(cliente);
                linha = leitor.ReadLine();
            }
            catch (System.FormatException ex)
            {
                // Nao solte uma exception aqui
                EfetuarLogDoErro(linha);
            }
            finally
            {
                colClient.Add(cliente);
                linha = leitor.ReadLine();
            }
        }
    
        entrada.Close();
    }
    Dica: Procure não soltar novas exception para tratamento de regras de negócios ou utilizar trycatch com o mesmo propósito.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito segunda-feira, 16 de julho de 2018 12:52
    • Marcado como Resposta Géberson Cardoso segunda-feira, 16 de julho de 2018 15:32
    segunda-feira, 16 de julho de 2018 12:47
  • Sim!

    "There are still situations in which a finally block won’t run. For example, when the try block goes into an infinite loop, it will never exit the try block and never enter the finally block. And in situations such as a power outage, no other code will run. The whole operating system will just terminate." - 70-483, pag 69

    No seu caso, soltando outra exceção dentro do catch.

    Você pode achar diversos artigos na internet sobre tratamento de erros, mas a melhor explicação está no livro da Certificação 70-483.

    70-483 - Microsoft PressStore


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    segunda-feira, 16 de julho de 2018 20:39

Todas as Respostas

  • Boa noite amigo.

    Gif

    Esta em vb.net, vc pode usa um converter caso não saiba converter.

    http://converter.telerik.com

    Codigo

    Imports System
    Imports System.IO
    Imports System.Text
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim open As New OpenFileDialog 'procurar arquivo
            Dim DadosSalvos As New List(Of String) 'salvar dados
            With open
                If .ShowDialog = Windows.Forms.DialogResult.OK Then 'open para procurar arquivo
                    Dim TXT As String = .FileName 'local do arquivo de texto 
                    Dim Ler As New StringReader(File.ReadAllText(TXT, Encoding.Default)) 'ler arrquivo de texto, obcervação use "Encoding.Default" para pegar asentos jo"ã"o
                    For x As Integer = 0 To File.ReadLines(TXT).Count - 1 'acount line
                        Dim Linha As String = Ler.ReadLine
                        Dim Nome As String = Split(Linha, ",")(0) 'Nome
                        Dim Idade As String = Split(Linha, ",")(1) 'Idade
                        DadosSalvos.Add("Nome:" & Nome & " Idade:" & Idade) 'salvar
                        MsgBox(DadosSalvos(x)) 'mostra
                    Next
                    Ler.Close() 'close StringReader
                    Ler.Dispose() 'Dispose memori StringReader
                End If
            End With
        End Sub
    End Class
    

    segunda-feira, 16 de julho de 2018 01:29
  • Boa noite João Paulo,

    Ler e escrever no arquivo é tranquilo. O que estou tendo dificuldade é para tratar a exceção(formato ou tipo inválido, por exemplo), gravar no log e fazer com que o programa continue rodando a partir da próxima linha. Essa é que é a minha dificuldade, por isso mostrei como estou usando o tray catch entendeu?

    vlw pela ajuda!

    segunda-feira, 16 de julho de 2018 01:39
  • Géberson, bom dia!

    O problema do código é porque no bloco catch, está sendo enviado uma nova exception. Ela quebra o fluxo do programa, pois sai do while.

    Quando uma exception sem tratamento é acionada, o .NET envia para a stack (métodos) acima. Pense em resolver da seguinte maneira

    List<Cliente> colClient = new List<Cliente>();
    
    Stream entrada = File.Open(caminho, FileMode.Open);
    using (StreamReader leitor = new StreamReader(entrada))
    {
        //StreamReader leitor = new StreamReader(entrada,System.Text.Encoding.UTF8);
        string linha = leitor.ReadLine();
        while (linha != null)
        {
            var cliente = new Cliente();
            var aux = linha.Split(';');
    
            try
            {
                cliente.IdentificadorERP = new Guid(aux[0]);
                cliente.Nome = aux[1];
                cliente.DataNascimento = Convert.ToDateTime(aux[2]);
                cliente.Regiao = aux[3];
                cliente.Pontos = Convert.ToInt32(aux[4]);
    
                colClient.Add(cliente);
                linha = leitor.ReadLine();
            }
            catch (System.FormatException ex)
            {
                // Nao solte uma exception aqui
                EfetuarLogDoErro(linha);
            }
            finally
            {
                colClient.Add(cliente);
                linha = leitor.ReadLine();
            }
        }
    
        entrada.Close();
    }
    Dica: Procure não soltar novas exception para tratamento de regras de negócios ou utilizar trycatch com o mesmo propósito.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito segunda-feira, 16 de julho de 2018 12:52
    • Marcado como Resposta Géberson Cardoso segunda-feira, 16 de julho de 2018 15:32
    segunda-feira, 16 de julho de 2018 12:47
  • Obrigado pela ajuda Bruno,

    Então neste caso, se entendi corretamente a sua explicação, pra eu tratar o erro eu vou precisar chamar um método para este fim no lugar da exceção lançada dentro do catch. É isso?

    segunda-feira, 16 de julho de 2018 15:35
  • Sim!

    "There are still situations in which a finally block won’t run. For example, when the try block goes into an infinite loop, it will never exit the try block and never enter the finally block. And in situations such as a power outage, no other code will run. The whole operating system will just terminate." - 70-483, pag 69

    No seu caso, soltando outra exceção dentro do catch.

    Você pode achar diversos artigos na internet sobre tratamento de erros, mas a melhor explicação está no livro da Certificação 70-483.

    70-483 - Microsoft PressStore


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    segunda-feira, 16 de julho de 2018 20:39