EXCESSÃO C# NÃO CONSIGO INTERCEPTAR CORRETAMENTE
Bom dia!
Estou fazendo um System.IO.FileStream para abrir um arquivo e gerar um ZIP. Tudo funciona bem até tentar abrir o arquivo que já está aberto pelo Word ou seu programa de origem.
Nota: a imagem anexa apresenta acima o erro no Debug que não consigo interceptar corretamente, como explico abaixo. Já a imagem abaixo, é o erro gerado pelo Word quando meu aplicativo tenta abrir o Doc. Também não consigo evitar isso, pois a cada tentativa, um novo aviso do Word é sobreposto e pode ficar vários abertos sucessivamente, dando muito trabalho ao usuário para fechar tudo.
Meu Try está pegando, mas somente no Exception (genérico), nenhum outro tipo consegue identificar, assim como não consigo pegar exatamente o erro de abertura por outro processo, não tenho como exibir essa mensagem ao usuário, pois o erro pode ser outro.
A única coisa que identifico no Debug é o código de erro -532459699, porem o Exception não possui a propriedade Error em sua variável e esse código está associado a _COMPlusExceptionCode uma propriedade NÃO PUBLICA.
Agradeço se alguém souber como resolver isso.
Meu código:
Estou fazendo um System.IO.FileStream para abrir um arquivo e gerar um ZIP. Tudo funciona bem até tentar abrir o arquivo que já está aberto pelo Word ou seu programa de origem.
Nota: a imagem anexa apresenta acima o erro no Debug que não consigo interceptar corretamente, como explico abaixo. Já a imagem abaixo, é o erro gerado pelo Word quando meu aplicativo tenta abrir o Doc. Também não consigo evitar isso, pois a cada tentativa, um novo aviso do Word é sobreposto e pode ficar vários abertos sucessivamente, dando muito trabalho ao usuário para fechar tudo.
Meu Try está pegando, mas somente no Exception (genérico), nenhum outro tipo consegue identificar, assim como não consigo pegar exatamente o erro de abertura por outro processo, não tenho como exibir essa mensagem ao usuário, pois o erro pode ser outro.
A única coisa que identifico no Debug é o código de erro -532459699, porem o Exception não possui a propriedade Error em sua variável e esse código está associado a _COMPlusExceptionCode uma propriedade NÃO PUBLICA.
Agradeço se alguém souber como resolver isso.
Meu código:
try
{
//Códido inicial ......
try
{
using (FileStream objStreamDestino = new FileStream(myCaminhoNomeArquivoDestino, FileMode.Create, FileAccess.Write))
{
//Arquivo que será compactado
using (FileStream arquivo = new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read)) [txt-color=#e80000]//AQUI GERA O ERRO SE ARQUIVO JÀ ABERTO[/txt-color]
{
ZipOutputStream objZipDestino = new ZipOutputStream(objStreamDestino);
// continuação do meu código ......
arquivo.Close();
arquivo.Dispose();
objZipDestino.Close();
objZipDestino.Dispose();
}
//fechando as comunicações.
objStreamDestino.Close();
objStreamDestino.Dispose();
}
}
catch (InvalidDataException)
{
MessageBox.Show([Ô]ExceptionDadosInvalidos[Ô]);
}
catch (FileLoadException)
{
MessageBox.Show([Ô]ExceptionArquivoAbertoOutroProcesso[Ô]);
}
catch (FileNotFoundException)
{
MessageBox.Show([Ô]ExceptionArquivoNaoEncontrado[Ô];
}
catch (ArgumentException)
{
MessageBox.Show([Ô]ExceptionArgumento[Ô]);
}
catch (PathTooLongException)
{
MessageBox.Show([Ô]ExceptionCaminhoGrande[Ô]);
}
catch (DirectoryNotFoundException)
{
MessageBox.Show([Ô]ExceptionPastaNaoExiste[Ô]);
}
catch (IOException)
{
MessageBox.Show([Ô]Exception_IO[Ô]);
}
catch (UnauthorizedAccessException)
{
MessageBox.Show([Ô]ExceptionAcessoNegado[Ô]);
}
catch (IndexOutOfRangeException)
{
MessageBox.Show([Ô]ExceptionFaixaParametros[Ô]);
}
catch (OutOfMemoryException)
{
MessageBox.Show([Ô]Memória ou espaço em disco cheio, operação não pode ser concluÃda.[Ô]);
}
}
catch (Exception) [txt-color=#e80000]//o erro CAI SEMPRE AQUI, veja imagem com código[/txt-color]
{
throw;
}
finally
{
//tentar evitar o erro de System.OutOfMemoryException ocorrido em um cliente
GC.WaitForPendingFinalizers();
}
Primeiro, se está usando blocos [Ô]using[Ô], você não precisa dos comandos de close e dispose.
Segundo, verifique se o arquivo está aberto.
Segundo, verifique se o arquivo está aberto.
Kerplunk bom dia!
Sobre fechar os objetos no Using eu não fazia, mas como estava gerando estouro de memória em alguns clientes, decidi forçar para tentar evitar, pois o Garbage poderia estar demorando para limpar tudo. Não sei se há outras formas, mas ocorre erros especÃficos em certos clientes que fica muito difÃcil saber o motivo.
Sobre verificar se o arquivo está aberto, em sistemas de grande concorrência pode acontecer de na fração de segundos entre o teste e a abertura do arquivo, um outro processo abra o arquivo primeiro e o erro irá ocorrer da mesma forma, Isso que constatei em alguns foruns. Porém se não há solução melhor por enquanto, eu acabei de implementar isso, assim devo reduzir bastante a incidência do problema.
Já a questão da mensagem exibida pelo Word, você tem alguma ideia de como evitar esse problema?.
Sobre fechar os objetos no Using eu não fazia, mas como estava gerando estouro de memória em alguns clientes, decidi forçar para tentar evitar, pois o Garbage poderia estar demorando para limpar tudo. Não sei se há outras formas, mas ocorre erros especÃficos em certos clientes que fica muito difÃcil saber o motivo.
Sobre verificar se o arquivo está aberto, em sistemas de grande concorrência pode acontecer de na fração de segundos entre o teste e a abertura do arquivo, um outro processo abra o arquivo primeiro e o erro irá ocorrer da mesma forma, Isso que constatei em alguns foruns. Porém se não há solução melhor por enquanto, eu acabei de implementar isso, assim devo reduzir bastante a incidência do problema.
Já a questão da mensagem exibida pelo Word, você tem alguma ideia de como evitar esse problema?.
Uma idéia é trabalhar com arquivos temporários copiando o arquivo antes de abrir.
Boa ideia, acho que irá resolver mesmo. Obrigado.
Tópico encerrado , respostas não são mais permitidas