none
error not all code paths return a value RRS feed

  • Pergunta

  • pessoal.. boa noite..

    estou criando um metodo de inserir dados numa classe e está ocorrendo o erro em questão: "error not all code paths return a value"

    porém, se eu não utilizar o "if" em negrito no tratamento de erro, o erro não ocorre.. segue abaixo parte do código.

    estou tentando fazer um tratamento especifico para quando a chave for duplicada..

            try
                {
                    conexao.Open();
                    SqlCommand comando = new SqlCommand();
                    comando.Connection = conexao;
                    comando.CommandText = @"INSERT INTO USU_T090BIO (USU_TIPDOC, USU_NUMDOC,USU_NUMDIG, USU_TEMPLATE)
                                            VALUES (@tipdoc, @numdoc,@numdig, @digital)";

                    comando.Parameters.AddWithValue("@tipdoc", this.tipdoc);
                    comando.Parameters.AddWithValue("@numdoc", this.numdoc);
                    comando.Parameters.AddWithValue("@numdig", this.numdig);
                    comando.Parameters.AddWithValue("@digital", this.digital);                

                    return comando.ExecuteNonQuery();
                }
                catch (SqlException erro)
                {
                    if (erro.Number == 2601)
                    {
                        throw new ApplicationException("O usuário já teve sua digital cadastrada com o dedo informado. \nUtilize outro dedo para novo cadastro. Erro: \n\n" + erro.Message);
                    }
                }

                catch (Exception erro)
                {
                    throw new ApplicationException("Não foi possível salvar os dados. Mais detalhes:\n\n" + erro.Message);
                }
                finally
                {
                    if (conexao.State == System.Data.ConnectionState.Open)
                        conexao.Close();
                }
       

    segunda-feira, 9 de abril de 2012 18:32

Respostas

  • Olá Kyrla,

    A mensagem de erro é clara: Existe pelo menos uma situação possível em que o código não está retornando nada para quem chamou a função, e é justamente quando ocorrer um erro do tipo SqlException que não seja o número 2601, ou seja, "e se não entrar no 'if', retorna o que?"

    try
    {
    	//...
    
    	return comando.ExecuteNonQuery();
    }
    catch (SqlException erro)
    {
    	if (erro.Number == 2601)
    	{
    		throw new ApplicationException("...");
    	}
    	
    	// E se não for o erro 2601? Retorna o que???
    }
    // ...

    Você precisa decidir o que faz sentido retornar quando ocorrer um erro SqlException com outros códigos diferentes...

    Retornar uma exceção diferente?

    Retornar 0 (zero)?

    Etc...



    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    segunda-feira, 9 de abril de 2012 23:43
    Moderador

Todas as Respostas

  • Olá, concerteza o seu método necessita de algum retorno e vc não está fazendo o:

    return "";


    Elvis Rodrigues
    Analista Desenvolvedor .Net
    MCTS .Net Framework, SQL Server 2005, WPF, ASP NET
    Email foxelv@hotmail.com

    segunda-feira, 9 de abril de 2012 18:45
  • meu método é do tipo int, teria que retornar 0 ou 1, como se trata de uma inserção.. não sei se seria interessante colocá-lo.. e este erro só está ocorrendo quando eu coloco o aquele if que marquei em negrito.. sem o if, sem erro...
    segunda-feira, 9 de abril de 2012 18:58
  • Kyrla,

    Voce utiliza o retorno do metodo pra alguma coisa? Voce pode mudar o metodo para void.


    se a resposta foi útil, classifique :)
    ate mais,

    Rodrigo Soria

    segunda-feira, 9 de abril de 2012 19:11
  • seu código nunca vai entrar no finally;

    por que vc retorna dentro do try;

    cria

    uma variável out para retornar o erro e coloca um return, assim:

    public int Inserir(out string erro)

    int retorno = 0;

      try
                {
                    conexao.Open();
                    SqlCommand comando = new SqlCommand();
                    comando.Connection = conexao;
                    comando.CommandText = @"INSERT INTO USU_T090BIO (USU_TIPDOC, USU_NUMDOC,USU_NUMDIG, USU_TEMPLATE)
                                            VALUES (@tipdoc, @numdoc,@numdig, @digital)";

                    comando.Parameters.AddWithValue("@tipdoc", this.tipdoc);
                    comando.Parameters.AddWithValue("@numdoc", this.numdoc);
                    comando.Parameters.AddWithValue("@numdig", this.numdig);
                    comando.Parameters.AddWithValue("@digital", this.digital);                

                    int retorno = comando.ExecuteNonQuery();

    erro = string.Empty;

                }
                catch (SqlException erro)
                {
                    if (erro.Number == 2601)
                    {
                        erro = "O usuário já teve sua digital cadastrada com o dedo informado. \nUtilize outro dedo para novo cadastro. Erro: \n\n" + erro.Message;

                    }
                }

                catch (Exception erro)
                {
                    erro = "Não foi possível salvar os dados. Mais detalhes:\n\n" + erro.Message;

                }

                finally
                {
                    if (conexao.State == System.Data.ConnectionState.Open)
                        conexao.Close();
                }

    return retorno;

    }


    Elvis Rodrigues
    Analista Desenvolvedor .Net
    MCTS .Net Framework, SQL Server 2005, WPF, ASP NET
    Email foxelv@hotmail.com

    segunda-feira, 9 de abril de 2012 20:35
  • Olá Kyrla,

    A mensagem de erro é clara: Existe pelo menos uma situação possível em que o código não está retornando nada para quem chamou a função, e é justamente quando ocorrer um erro do tipo SqlException que não seja o número 2601, ou seja, "e se não entrar no 'if', retorna o que?"

    try
    {
    	//...
    
    	return comando.ExecuteNonQuery();
    }
    catch (SqlException erro)
    {
    	if (erro.Number == 2601)
    	{
    		throw new ApplicationException("...");
    	}
    	
    	// E se não for o erro 2601? Retorna o que???
    }
    // ...

    Você precisa decidir o que faz sentido retornar quando ocorrer um erro SqlException com outros códigos diferentes...

    Retornar uma exceção diferente?

    Retornar 0 (zero)?

    Etc...



    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    segunda-feira, 9 de abril de 2012 23:43
    Moderador
  • seu código nunca vai entrar no finally;

    por que vc retorna dentro do try;

    cria

    uma variável out para retornar o erro e coloca um return, assim:

    public int Inserir(out string erro)

    Elvis,

    A execução do Finally é garantida após o return. Não há problema nenhum nesta parte do código, e não faz o menor sentido criar uma variável out para retornar algo que pode ser perfeitamente retornado no método.



    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    segunda-feira, 9 de abril de 2012 23:47
    Moderador
  • Caio, sua explicação foi ótima!

    não justificava haver erro de return sendo que sem o if o código funcionava corretamente.. porém, preciso disparar uma execessão do tipo sqlserver e pra isso precisava de um else.. que seria o retorno daquele bloco né..

    valeu demais!

    terça-feira, 10 de abril de 2012 12:54