Gethrforexception ioexception c #


Eu descobri que, às vezes, nas operações de IO, o IOException comum é jogado. 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 re-lançar uma exceção, usando o código de erro específico do meu aplicativo, para dar ao usuário algumas dicas sobre o que deu errado. Mas não consegui encontrar a lista de possíveis valores de HResult para IOException. Mais um coisa que estou preso é que, para diferentes códigos de HResult, a raiz pode ser a mesma - por exemplo, 0x8007052E e 0x80070569 - ambos correspondem a falha de logon: nome de usuário desconhecido ou senha incorreta. Tentei pesquisar algo como valores IOException HResult, mas não havia nada de especial para mapear o IOException HResult com erro legível por humanos (como este ou este). Eu também vi a questão aqui, que é muito semelhante, mas ainda não há solução. Então, onde está a documentação sobre os valores da IOException HResults Ao usar o Marshal. GetHRForException (), você envolveu 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 veio do Windows. Você pode 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. Pessoalmente, uso sempre o arquivo de cabeçalho do WinError. h SDK. Depende da versão do VS que você possui, a maioria dos programadores irá encontrá-lo de volta no diretório C: Program Files (x86) Microsoft SDKsWindowsv7.1AInclude. Você também possui um útil utilitário disponível, execute errlook. exe a partir do prompt de comando do Visual Studio. Uma boa maneira de tê-lo prontamente disponível é adicionando-o ao menu Ferramentas. Use ferramentas Ferramentas externas, botão Adicionar, Pesquisa de erro de título, Comando C: Arquivos de programas (x86) Microsoft Visual Studio 12.0Common7Toolserrlook. exe. Ajuste o caminho conforme necessário para combinar sua versão VS. Você também descobrirá que os códigos de erro não são os mesmos. 0x80070569 amp 0xffff 0x569 1385. Pesquisando WinError. h para esse código de erro produz ERRORLOGONTYPENOTGRANTED, falha de logon: o usuário não recebeu o tipo de logon solicitado neste computador. O tipo de erros de IOException que você pode obter não está de forma alguma restrito. O Windows não possui especificações de exceção, apenas os códigos de erro mais comuns estão listados na documentação do MSDN para uma determinada função winapi. 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 9 de setembro às 8: 57 Bem, é um pouco mal-humorado, mas aqui vamos. A primeira coisa a fazer é obter o HResult da exceção. Como um membro protegido, precisamos de um pouco de reflexão para obter o valor. Heres um método de extensão para fazer o truque: agora, no seu escopo de captura, você pode obter o HResult: daqui, você terá que interpretar o HResult. Você precisará deste link. Precisamos obter o código de erro que é armazenado nos 16 primeiros bits do valor, então heres algum pouco de operação: Então, teste-o usando: talvez existam algumas funções de nível superior para obter todas essas coisas, mas pelo menos isso funciona. Respondeu 15 de fevereiro às 13:37 1, como na verdade (desde. NET 4.5) não é tão bagunçado porque HResult foi promovido publicamente. A única coisa que resta é talvez armazenar em cache a chamada GetProperties em um membro estático - o que seria um wrapper agradável para ter um invólucro compatível com quotbackwards (desde que você use bandeiras de ligação pública e não pública - o que você fez :-)). No entanto, diante da redução de exceção, o ganho de desempenho de um membro em cache provavelmente é discutido. Ndash Christian. K 22 de dezembro 15 às 17:07 Para torná-lo perfeitamente limpo, I39m lançando Exception. HResult para o meu HResultErrorCodes enum com base em ushort que aplica de forma única a máscara 0xFFFF e remove a necessidade de números mágicos ou constantes no código de chamada. Ndash jnm2 22 de dezembro 15 às 17:16

Comments