Friday, 20 October 2017

Gethrforexception Ioexception C #


Descobri que às vezes em IO operações comum IOException é lançada. Eu posso usar o método Marshal. GetHRForException (Exception e) (encontrado aqui) para determinar o código de erro específico. Depois disso, eu quero voltar a lançar uma exceção, usando meu código de erro específico do aplicativo, para dar ao usuário algumas dicas sobre o que deu errado. Mas não consegui encontrar a lista de possíveis valores HResult para IOException. Mais uma coisa que eu estou preso com é que para diferentes códigos HResult causa raiz pode ser o mesmo - por exemplo, 0x8007052E e 0x80070569 - ambos correspondem a Falha de logon: nome de usuário desconhecido ou senha incorreta. Tentei pesquisar algo como IOException HResult valores, mas não havia nada de especial para o mapeamento IOException HResult com humanos-legível erro (como este ou este). Eu também vi a pergunta aqui, que é muito semelhante, mas ainda não há solução. Então, onde está a documentação sobre valores IOException HResults usando Marshal. GetHRForException () você envolvido o código de erro do Windows em um código de erro HResult. Para uma IOException sempre será o número de erro do Windows 0x80070000. O 8 significa erro, o 7 significa que ele veio do Windows. Você poderia simplesmente usar amp 0xffff para recuperar o código de erro original novamente. Converta o resultado de volta para decimal e você terá muitos lugares para descobrir o que significa o código de erro. Eu, pessoalmente, sempre usar o arquivo de cabeçalho WinError. h SDK. Depende da versão do VS que você tem, a maioria dos programadores vai encontrá-lo de volta no C: Arquivos de Programas (x86) Microsoft SDKsWindowsv7.1AInclude diretório. Você também tem um utilitário acessível disponível, execute errlook. exe a linha de comando do Visual Studio. Uma boa maneira de tê-lo prontamente disponível é adicionando-o ao menu Ferramentas. Usar Ferramentas Ferramentas Externas, botão Adicionar, pesquisa de Erro de Título, Comando C: Arquivos de Programas (x86) Microsoft Visual Studio 12.0Common7Toolserrlook. exe. Ajustar o caminho conforme necessário para corresponder à sua versão VS. Você também vai descobrir que os códigos de erro não são os mesmos. 0x80070569 amp 0xffff 0x569 1385. Procurar WinError. h para esse código de erro produz ERRORLOGONTYPENOTGRANTED, falha de início de sessão: o utilizador não foi concedido o tipo de início de sessão solicitado neste computador. O tipo de erros de IOException que você pode obter não são de qualquer maneira restritos. O Windows não tem especificações de exceção, somente os códigos de erro mais comuns estão listados na documentação do MSDN para uma função winapi particular. Muito parecido com as exceções. NET. Um mal necessário, muitos códigos de erro IOException são gerados por drivers que não foram escritos pela Microsoft. Respondeu Set 9 14 at 8: 57A propriedade System. Exception. HResult está protegida. Como posso peek dentro de uma exceção e obter o HResult sem recorrer a reflexão ou outros hacks feio Heres a situação: Eu quero escrever uma ferramenta de backup, que abre e lê arquivos em um sistema. Eu abro o arquivo com FileAccess. Read e FileShare. ReadWrite, de acordo com esta orientação. Porque eu não me importo se o arquivo está aberto para escrever no momento em que eu li. Em alguns casos, quando um arquivo que estou lendo é aberto por outro aplicativo, o método System. IO. FileStream. Read () lança um System. IO. IOException, O processo não pode acessar o arquivo porque outro processo bloqueou uma parte do Arquivo. Isso é erro 33. ou eu acho HResult 0x80070021. EDIT. Eu acredito que isso pode ser retornado quando outro processo chama LockFileEx para bloquear um intervalo de bytes dentro de um arquivo. Id gostaria de pausar e tentar novamente quando recebo este erro. Acho que essa é a ação apropriada a ser tomada aqui. Se o processo de bloqueio libera o bloqueio de intervalo de bytes rapidamente, então eu posso continuar lendo o arquivo. Como posso distinguir uma IOException por esta razão, de outros que eu posso pensar dessas maneiras: reflexão privada - não quero fazer isso. O Perf fede. Chamar Exception. ToString () e analisar a seqüência de caracteres. Parece hacky. Não funcionará em versões i18n. Eu não gosto destas opções. Não há uma maneira melhor, mais limpa que eu só procurei ao redor e encontrei System. Runtime. InteropServices. Marshal. GetHRForException. Será que retornar um uint como 0x80070021Hi. Eu pego IOException e quero separar o caso quando eu recebo quotThe processo não pode acessar o arquivo porque ele está sendo usado por outro processquot erro de outros possíveis IOException-s. Verificar o texto da mensagem não é uma opção porque o aplicativo é multilíngüe e pode usar uma versão. NET que não seja o inglês. Existe alguma maneira de fazê-lo, algum código de erro ou algo quotSergei Shelukhinquot ltrealgeekgt escreveu em mensagem de notícias: 4ccaed23-4b81-4fe6-9bb2-646a5b5fe718t1g2000pra. googlegroups. Gt Oi. Eu pego IOException e quero separar o caso quando eu receber o processo gt quotThe não pode acessar o arquivo porque ele está sendo usado por gt outro erro processquot de outros possíveis IOException-s. A verificação do texto da mensagem gt não é uma opção porque o aplicativo é multilíngüe e gt pode usar uma versão. NET que não seja o inglês. Gt gt Existe alguma maneira de fazê-lo, algum código de erro ou algo Call Marshal. GetLastWin32Error no seu manipulador catch, e verificar o código de erro Win32. Isso está dependendo um pouco demais em um detalhe de implementação, IMO. Concedido, o acesso ao arquivo provavelmente será feito SEMPRE através da camada P / Invoke, mas a suposição de que não haverá chamadas para a camada P / Invoke entre o lançamento da exceção ea próxima chamada para GetLastWin32Error é uma sugestão frágil, no melhor. O que o OP deve realmente fazer é fazer a chamada para CreateFile-se, e interpretar o código de erro (se houver um). QuotWilly Denoyette MVPquot ltwilly. denoyettetelenet. begt escreveu em mensagem de notícias: uB5e3EoPIHA.1188TK2MSFTNGP04.phx. gbl. Gt quotSergei Shelukhinquot ltrealgeekgt escreveu na mensagem gt news: 4ccaed23-4b81-4fe6-9bb2-646a5b5fe718t1g2000pra. googlegroups. Gtgt Oi. Eu pego IOException e quero separar o caso quando eu receber o processo gtgt quotThe não pode acessar o arquivo porque ele está sendo usado por gtgt outro processquot erro de outras possíveis IOException-s. A verificação do texto da mensagem gtgt não é uma opção porque o aplicativo é multilíngüe e o gtgt pode usar uma versão. NET que não seja o inglês. Gtgt gtgt Existe alguma maneira de fazê-lo, algum código de erro ou algo gt gt gt Chamar Marshal. GetLastWin32Error no seu manipulador catch, e verificar o código de erro Win32 gt. Gt gt Willy. Gt Se esta é sua preocupação basta chamar Marshal. GetHRForException que retorna o HResult associado com a exceção lançada, mascarar os 16 bits mais altos fora e você tem o código de erro Win32. QuotNicholas Paldino. NET / C MVPquot ltmvpspam. guard. caspershousegt escreveu na mensagem news: uuc8cNoPIHA.3676TK2MSFTNGP06.phx. gbl. Gt Isso está dependendo um pouco demais em um detalhe de implementação, gt IMO. Concedido, o acesso ao arquivo provavelmente será feito SEMPRE através da camada gt P / Invoke, mas a suposição de que não haverá chamadas para a camada gt P / Invoke entre o lançamento da exceção ea próxima chamada para gt GetLastWin32Error é um Sugestão frágil, na melhor das hipóteses. Gt gt O que o OP deve realmente fazer é fazer a chamada para CreateFile-se, gt e interpretar o código de erro (se houver um). Gt gt - gt - Nicholas Paldino. NET / C MVP gt - mvpspam. guard. caspershouse gt gt quotWilly Denoyette MVPquot ltwilly. denoyettetelenet. begt escreveu na mensagem gt news: uB5e3EoPIHA.1188TK2MSFTNGP04.phx. gbl. Gtgt quotSergei Shelukhinquot ltrealgeekgt escreveu na mensagem gtgt news: 4ccaed23-4b81-4fe6-9bb2-646a5b5fe718t1g2000pra. googlegroups. Gtgtgt Oi. Eu pego IOException e quero separar o caso quando eu receber gtgtgt quotThe processo não pode acessar o arquivo porque ele está sendo usado por gtgtgt outro processquot erro de outras possíveis IOException-s. A verificação do texto da mensagem gtgtgt não é uma opção porque o aplicativo é multilíngüe e o gtgtgt pode usar uma versão. NET que não seja o inglês. Gtgtgt gtgtgt Existe alguma maneira de fazê-lo, algum código de erro ou algo gtgt gtgt gtgt Chamar Marshal. GetLastWin32Error no seu manipulador de captura e verificar o código de erro gtgt Win32. Gtgt gtgt Willy. Gtgt gt gt Cópia de direitos autorais 2005-2016, TechTalkz. Todos os direitos reservados.

No comments:

Post a Comment