EXCESSÃO C# NÃO CONSIGO INTERCEPTAR CORRETAMENTE
#477241 - 19/10/2017 10:17:15
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.
//Códido inicial ......
using (FileStream objStreamDestino = new FileStream(myCaminhoNomeArquivoDestino, FileMode.Create, FileAccess.Write))
using (FileStream arquivo = new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read)) //AQUI GERA O ERRO SE ARQUIVO JÀ ABERTO
// continuação do meu código ......
objZipDestino.Dispose();
objStreamDestino.Dispose();
MessageBox.Show("ExceptionDadosInvalidos");
MessageBox.Show("ExceptionArquivoAbertoOutroProcesso");
MessageBox.Show("ExceptionArquivoNaoEncontrado";
MessageBox.Show("ExceptionArgumento");
MessageBox.Show("ExceptionCaminhoGrande");
MessageBox.Show("ExceptionPastaNaoExiste");
MessageBox.Show("Exception_IO");
MessageBox.Show("ExceptionAcessoNegado");
MessageBox.Show("ExceptionFaixaParametros");
MessageBox.Show("Memória ou espaço em disco cheio, operação não pode ser concluída.");
catch (Exception) //o erro CAI SEMPRE AQUI, veja imagem com código
//tentar evitar o erro de System.OutOfMemoryException ocorrido em um cliente
Resposta escolhida #477242 - 19/10/2017 10:55:12
Primeiro, se está usando blocos "using", você não precisa dos comandos de close e dispose.
Segundo, verifique se o arquivo está aberto.
#477244 - 19/10/2017 11:23:50
Última edição em 19/10/2017 12:11:03 por LUIS HERRERA
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.