Gethrforexception ioexception when try


Eu tenho algum código IO que lê um fluxo dentro de um try..catch. Ele captura IOException e chama System. Runtime. InteropServices. Marshal. GetHRForException () dentro da captura, na tentativa de tomar diferentes ações com base no HResult. Algo como isto: mas executando este código no ASP com confiança, recebo esta exceção: algumas questões: acho que a exceção está ocorrendo porque o GetHRForException chama o código não gerenciado, o que não é permitido em confiança média. Corrigir Esta exceção está sendo lançada, não no momento da execução do GetHRForException, mas no momento em que o método está sendo JITADO - Corrigido (O stacktrace mostra meu método, mas eu tenho 99 certeza de que uma exceção de IO não ocorreu) Se assim for, Existe uma maneira para eu variar o comportamento em um ambiente de confiança parcial, para que eu não ligue para o GetHRForException (código não gerenciado), onde não é permitido. Em outras palavras, como posso permitir que o JIT tenha sucesso no tempo de compilação, enquanto também Avaliando em tempo de execução se o código deve chamar GetHRForException () Algo como isto: acho que existe um mecanismo de tempo de execução para testar se as permissões estão disponíveis, mas não conseguiu encontrá-lo. EDITAR. Este artigo de blog é a resposta ShawnFa da Microsoft diz que você não pode fazer uma tentativa. Pegar (SecurityException) em torno de um método protegido por um LinkDemand. Se MethodA () chama MethodB () e MethodB () estiver marcado com LinkDemand para confiança total, o LinkDemand é verificado com MethodA is Jited. Portanto, para evitar o SecurityException, preciso extrair Marshal. GetHRForException para um método separado. Isso é correto Aplicado ao meu código, MethodA () pode ser o código que chama Read e, em seguida, na tentativa tenta chamar GetHRForException (). GetHRForException é MethodB (). O LinkDemand é avaliado quando MethodA () é JITd. (Este LinkDemand falha no meu cenário ASP de confiança média). Se eu mover o GetHRForException para um novo método, MethodC (), e condicionalmente chamar MethodC () somente depois que uma permissão imperativa. Dandand () for bem-sucedido, teoricamente, eu poderia ser capaz de evitar o SecurityException no JIT, porque MethodC () será JITd somente após a permissão. Demain () é bem-sucedido. Perguntou Jul 12 09 às 14:20 O método requerido é SecurityPermission. IsUrestrito (). Retorna um verdadeiro ou falso indicando se a permissão é permitida ou não. Não exige uma permissão, assim como SecurityPermission. Demand (). Eu uso IsUnresticted com SecurityPermissionFlag. UnmanagedCode para ver se o assembly pode chamar o código não gerenciado e, em seguida, chamar o código não gerenciado somente se permitido. Há um toque adicional. O compilador JIT, ao compilar um método, verifica CodeAccessPermission LinkDemands em qualquer método chamado meu método para ser compilado. Marshal. GetHRForException () é marcado com um LinkDemand. Por isso, o meu método que chama Marshal. GetHRForException () lançará uma SecurityException incompetável no momento da compilação JIT, quando executada em um ambiente restrito, como ASP com confiança média. Portanto, nunca devemos JIT o método que chama Marshal. GetHRForException () nesse caso, o que significa que eu preciso romper Marshal. GetHRForException () em um método separado no meu código que é chamado (e, portanto, JITted) somente quando UnmanagedCode é Sem restrições. Heres algum código de exemplo: respondeu Jul 20 09 às 17:56 Sim - confiança média não permitirá chamadas em código não gerenciado. O único nível de confiança que o permite é confiança total. Depende. As demandas de CAS podem ocorrer no tempo de execução, mas o ambiente de hospedagem também pode andar e procurar coisas que não pode fazer. Você pode testar para ver se você pode fazer uma chamada para código não gerenciado usando uma demanda de CAS com uma instância de SecurityPermission. O código para fazer uma demanda do CAS parece que isto respondeu Jul 12 09 às 14:32 OK, esta é uma ótima informação. Isso abrange a parte b do Q3. Mas e quanto a parte de como faço para obter a compilação JIT para ter sucesso Posso marcar meu método com um atributo de segurança ou. Lembre-se, minha teoria é que o erro SecurityPermission não está acontecendo no tempo de execução, está acontecendo durante o JIT - e acho que você confirmou que isso é possível. Então, a questão é, como escrevo o código para permitir que o JIT compile. Ndash Cheeso 12 de julho de 09 às 15:50 Isso deveria estar acontecendo no tempo de execução, caso contrário a montagem não seria mesmo carregada - e para que isso aconteça, a montagem precisa ser marcada como exigindo a permissão. Mesmo assim, isso provavelmente é uma verificação de tempo de execução, pois isso ocorrerá na carga de montagem, que pode ser em tempo de execução. Ndash blowdart Jul 12 09 às 16:24 Tipos diferentes de checagem, as demandas de links são atributos em um método e, de fato, são verificadas no tempo JIT. É muito usado pela própria estrutura e é raro vê-lo fora da fonte CLR. O que eu demonstro é uma demanda imperativa, e não uma declarativa como uma SecurityPermission (SecurityAction. LinkDemand, Unrestricted true) ndash blowdart Jul 12 09 às 18: 55Putting It All Together As seções anteriores descreveram como construir a tentativa. pegar. E, finalmente, blocos de código para o método writeList na classe ListOfNumbers. Agora, digamos que digite o código e investigue o que pode acontecer. Quando todos os componentes são juntos, o método writeList se parece com o seguinte. Como mencionado anteriormente, o bloco de tentativa deste método possui três possibilidades de saída diferentes, são dois deles. O código na instrução try falha e lança uma exceção. Isso pode ser uma IOException causada pela nova instrução FileWriter ou uma IndexOutOfBoundsException causada por um valor de índice incorreto no loop for. Tudo é bem-sucedido e a declaração de tentativa sai normalmente. Vamos examinar o que acontece no método writeList durante essas duas possibilidades de saída. Cenário 1: ocorre uma exceção A declaração que cria um FileWriter pode falhar por vários motivos. Por exemplo, o construtor do FileWriter lança uma IOException se o programa não puder criar ou escrever no arquivo indicado. Quando FileWriter lança uma IOException. O sistema de tempo de execução imediatamente pára de executar o método de tentativa do bloco, as chamadas que estão sendo executadas não estão concluídas. O sistema de tempo de execução começa a pesquisar no topo da pilha de chamadas do método para um manipulador de exceção apropriado. Neste exemplo, quando o IOException ocorre, o construtor FileWriter está no topo da pilha de chamadas. No entanto, o construtor FileWriter não possui um manipulador de exceção apropriado, então o sistema de tempo de execução verifica o próximo método 151 no método writeList 151 na pilha de chamadas do método. O método writeList possui dois manipuladores de exceção: um para IOException e outro para IndexOutOfBoundsException. O sistema de tempo de execução verifica os manipuladores writeList 39s na ordem em que eles aparecem após a instrução try. O argumento para o primeiro manipulador de exceção é IndexOutOfBoundsException. Isso não corresponde ao tipo de exceção lançado, então o sistema de tempo de execução verifica o manipulador de exceção seguinte 151 IOException. Isso corresponde ao tipo de exceção que foi acionada, de modo que o sistema de tempo de execução encerre sua busca por um manipulador de exceções apropriado. Agora que o tempo de execução encontrou um manipulador apropriado, o código nesse bloco catch é executado. Depois que o manipulador de exceção é executado, o sistema de tempo de execução passa o controle para o bloco final. O código no finally block é executado independentemente da exceção capturada acima. Nesse cenário, o FileWriter nunca foi aberto e não precisa ser fechado. Após o final do bloco finalizar a execução, o programa continua com a primeira declaração após o bloqueio final. Aqui é a saída completa do programa ListOfNumbers que aparece quando uma IOException é lançada. O código em negrito na lista a seguir mostra as declarações que são executadas durante esse cenário: Cenário 2: A tentativa Bloquear Sai Normalmente Neste cenário, todas as instruções dentro do escopo do bloco try são executadas com sucesso e não lançam exceções. A execução cai no fim do bloco de tentativa e o sistema de tempo de execução passa o controle para o bloco final. Como tudo foi bem sucedido, o PrintWriter está aberto quando o controle atinge o finally block, que fecha o PrintWriter. Mais uma vez, após o final do bloco terminar a execução, o programa continua com a primeira declaração após o bloqueio final. Aqui está o resultado do programa ListOfNumbers quando nenhuma exceção é lançada. O código em negrito no exemplo a seguir mostra as declarações que são executadas durante esse cenário.

Комментарии