重新抛出后丢失异常

时间:2018-11-19 13:29:24

标签: c# exception

早上好,伙计们!

我有一个方法ValidarConexaoEPI,该方法可以验证连接字符串以尝试与其建立连接。如果发生异常,则调用“验证”一个SolicitarNovaSincronizacao的方法,将其捕获并重新抛出可操纵的异常。

public static SincronizacaoSinc SolicitarNovaSincronizacao(int? idUsuario, int idAlmoxarifado, string versaoAplicacao, bool validaSincronizacaoEmAndatmento = true)
    {
        SincronizacaoSinc sincronizacaoSinc = null;

        using (var conexaoLocal = new SqlConnectionEPI(_DbLocalConnectionString))
        using (var conexaoServidor = new SqlConnectionEPI(_DbOnlineConnectionString))
        {
            sincronizacaoSinc = new SincronizacaoSinc(idUsuario, idAlmoxarifado, versaoAplicacao);

            try
            {
                if (UtilDataAccess.ValidarConexaoEPI(conexaoLocal) && UtilDataAccess.ValidarConexaoEPI(conexaoServidor))
                {
                    ValidarAlmoxarifadoBaseOnline(conexaoServidor, idAlmoxarifado);
                    ValidarUsuarioBaseOnline(conexaoServidor, idUsuario);

                    CriarRegistroSincronizacao(conexaoLocal, conexaoServidor, sincronizacaoSinc);

                    if(validaSincronizacaoEmAndatmento)
                    {
                        SolicitarSincronizacao(conexaoServidor, sincronizacaoSinc);
                    }                        

                    AtualizarRegistroSincronizacao(conexaoLocal, conexaoServidor, sincronizacaoSinc);
                }

                conexaoServidor.SqlTransaction.Commit();
                conexaoLocal.SqlTransaction.Commit();
            }
            catch (Exception exception)
            {
                throw new Exception(String.Format(
                    "Erro ao iniciar sincronizacao. {0}", exception.Message), exception.InnerException);
            }
        }

        return sincronizacaoSinc;
    }


public static bool ValidarConexaoEPI(SqlConnectionEPI conexao) //This method is in another static class
    {
        try
        {
            conexao.Open();
        }
        catch (SqlException sqlException)
        {
            var dataSource = conexao != null && conexao.SqlConnection != null
                ? conexao.SqlConnection.DataSource : "string de conexão inválida";

            throw new Exception(String.Format(
                "Não foi possível estabelecer uma conexão com o banco de dados ({0}).", dataSource), sqlException);
        }
        catch (Exception exception)
        {
            throw new Exception(String.Format(
                "Não foi possível estabelecer uma conexão com o banco de dados: {0}", exception.Message), exception);
        }

        return true;
    }

但是,重新抛出之后,我丢失了异常数据。下一个方法(称为SolicitarNovaSincronizacao()的方法)将收到NullReference异常。如您所见:

ValidarConexaoEPI()上的异常捕获:

NullReference异常捕获:

通过SolicitarNovaSincronizacao进行的其他所有其他异常捕获都可以,仅此一个问题就会发生。可以使用新的挂载异常。

PS:我知道这不是try / catch的正确用法!不是我的代码。

编辑:

这是NullReferenceException的StackTrace:

em AG.ControleEPI.Dados.SqlConnectionEPI.Dispose()不存在C:\ Projetos \ AG \ TFS2013 \ ControleEPI \ Main \ Source-locais \ AG.ControleEPI.Dados \ ADO \ SqlConnectionEPI.cs:linha 28    em AG.ControleEPI.Dados.ADO.SincronizacaoDataAccess.SolicitarNovaSincronizacao(Nullable`1 idUsuario,Int32 idAlmoxarifado,String versaoAplicacao,Boolean validaSincronizacaoEmAndatmento)na C:\ Projetos \ Source \ AG \ E-E.Control。 \ ADO \ SincronizacaoOnline \ SincronizacaoDataAccess.cs:linha 50    em AG.ControleEPI.Negocio.Gerenciador。 cs:linha 84

0 个答案:

没有答案