早上好,伙计们!
我有一个方法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