Eu não tenho IDE em minhas mãos agora, mas eu assumiria que, uma vez que 180Exception é a super-classe de exceções verificadas e não verificadas, ele compilará. Por exemplo. Uma Nullpointer-Exception (que é uma exceção não verificada e uma subclasse de Exception) poderia basicamente ser jogada em qualquer lugar, portanto, o código seria compilado. Ndash Christian 21 de abril 15 às 14:51 Como apontado nos comentários, você não pode pegar uma exceção que não é jogada pelo código dentro do seu bloco de tentativa. Tente alterar o seu código para: Verifique sempre a documentação para ver quais exceções são lançadas por cada método. Você também pode ler sobre o assunto de exceções verificadas e não verificadas antes que isso cause alguma confusão no futuro. E: workspacepascal1srcpascal1gtjava Test 8 a Exception in thread quotmainquot java. lang. NumberFormatException: Para string de entrada: quota quot em java. lang. NumberFormatException. forInputString (Origem Desconhecida) em java. lang. Integer. parseInt (Origem Desconhecida) em java. lang. Integer. parseInt (Origem Desconhecida) em Test. main (Test. java:14) ndash user3407967 24 de março 14 às 15:31 Você deve embrulhar tudo em outro try-catch-block para fazê-lo funcionar. Mas para ser honesto, esse seria um código muito feio. Eu acho que você precisa se familiarizar mais com os conceitos básicos de manipulação de exceções, em primeiro lugar. O que você está tentando aqui é lançar uma exceção para jogar outra. Normalmente isso não é necessário e não levará a um bom código. Ndash Christian Mar 24 14 em 15: 55Marshal. GetHRForException faz mais do que apenas Get-HR-For-Exception Let8217s primeiro comece olhando um pequeno fragmento de código: Isso parece perfeitamente bem, certo, não realmente. Acontece que esta API é realmente mal nomeada, e realmente faz mais do que apenas recuperar o RH do objeto de exceção. Usar esta API incorretamente pode dar-lhe alguns problemas estranhos, como, por exemplo, descartar uma exceção antiga e incorreta. Então, o que a API realmente faz. Além de retornar o HRESULT, essa função também define o objeto IErrorInfo do segmento atual como o objeto de exceção. Cada thread tem um objeto COM associado IErrorInfo, inadimplente para NULL. Este objeto IErrorInfo representa a falha da última chamada da API COM, que é como a GetLastError () Win32 API ou o errno C api. No objeto IErrorInfo, você pode obter mais informações, como a descrição do erro, o contexto do arquivo de ajuda, etc., que lhe dá mais informações sobre o erro. Ao definir o objeto IErrorInfo para o objeto de exceção (na verdade, configurando a implementação do objeto de exceção do IErrorInfo, que é compartilhada por todos os objetos gerenciados), você está dizendo essencialmente aos seus chamadores, quotey, há uma falha, it8217s esse objeto de exceção e Você deve fazer algo sobre isso, o que obviamente é uma má idéia se você quiser apenas recuperar o RH. Em muitos casos, isso pode passar despercebido, se o seu callercallee COM lidar com o IErrorInfo corretamente. Por quotcorrectamente, quero dizer, eles seguem o protocolo COM IErrorInfo, que são basicamente: 1. O chamador usa IErrorInfo do tópico atual ao chamar uma interface COM que explicitamente diz que o suporte ao IErrorInfoquot 2. O destinatário (que implementa a interface COM) que diz Quero suporte IErrorInfoquot, deve limpar IErrorInfo antes de retornar. Isso é muito parecido com GetLastError () errno, right Se este for o caso, o IErrorInfo configurado incorretamente no tópico, normalmente seria substituído por alguma implementação de interface que suporte o IErrorInfo ou seja ignorada. No entanto, como o protocolo que descrevi não é muito bem compreendido por todos os desenvolvedores COM, I8217ve casos frequentemente vistos em que o componente COM apenas diz quotsure, eu apoio IErrorInfo em cada interface COM e eles não definem o IErrorInfo. E então, o chamador desta interface COM praticamente implorada, acabaria usando o IErrorInfo configurado pela chamada GetHRForException anteriormente e levando a acreditar que existe um erro. Por exemplo, let8217s consideram o seguinte cenário: Algumas partes do componente COM invocam o código de código lançam uma exceção, diz que o código IOException captura a exceção e lança Marshal. GetHRForException, que define o IErrorInfo para essa exceção, chamadas de código IOException para outro componente COM B, chamadas Em IB. Func IB. Func falhou e retornar algum código de falha de RH, diga EOUTOFMEMORY CLR vê o código de falha de HR e peça ao componente COM B quotdo você suporte IErrorInfoquot e B responda quotsure, por que não, exceto que doesn8217t realmente o suporta e Ele não define o IErrorInfo CLR recuperar o IErrorInfo e vê que ele é realmente uma exceção gerenciada e lança a exceção IOException em vez de OutOfMemoryException. Agora, você pode estar se perguntando: para o qual esta API realmente se destina, em primeiro lugar, é realmente usada em lugares na interoperabilidade COM, onde você deseja retornar o HRESULT e definir o IErrorInfo sozinho. Isso não ocorre com muita freqüência. A maioria das pessoas ficaria feliz o suficiente para permitir que a interoperabilidade COM cuide dessa parte convertendo Exception para HR e IErrorInfo (que, por acaso, lança Marshal. GetHRForException). Então, a menos que você realmente saiba o que está fazendo, meu conselho é ficar longe de Marshal. GetHRForException. E se você realmente quiser realmente obter o HRESULT para uma Exceção específica, você deve usar a propriedade Exception. HResult.
Comments
Post a Comment