Wednesday, 1 February 2017

Gethrforexception Ioexception N'Est Jamais Lancée

Je n'ai pas d'IDE à mes mains en ce moment, mais je suppose que puisque 180Exception est la super-classe d'exceptions vérifiées et non vérifiées, il va compiler. Par exemple. Un Nullpointer-Exception (qui est une exception non cochée et une sous-classe d'exception) pourrait être jeté n'importe où, donc le code compilerait. Ndash Christian Apr 21 15 at 14:51 Comme indiqué dans les commentaires, vous ne pouvez pas attraper une exception thats pas jeté par le code dans votre bloc d'essai. Essayez de modifier votre code pour: Toujours vérifier la documentation pour voir quelles exceptions sont jetées par chaque méthode. Vous pouvez également lire sur le sujet des exceptions vérifiées et non contrôlées avant que cela vous cause toute confusion dans l'avenir. E: workspacepascal1srcpascal1gtjava Test 8 a Exception dans thread quotmainquot java. lang. NumberFormatException: Pour la chaîne d'entrée: quota quot at java. lang. NumberFormatException. forInputString (Source inconnue) at java. lang. Integer. parseInt (source inconnue) at java. lang. Integer. parseInt (Source inconnue) à Test. main (Test. java:14) ndash user3407967 Mar 24 14 à 15:31 Vous devez tout envelopper dans un autre bloc try-catch pour le faire fonctionner. Mais pour être honnête, ce serait très laid code. Je pense que vous devez vous familiariser davantage avec les concepts de base de la gestion des exceptions en premier lieu Ce que vous essayez ici est de lancer une exception pour en jeter une autre. Habituellement, ce n'est pas nécessaire et ne mènera pas à un bon code. Ndash Christian Mar 24 14 à 15: 55Marshal. GetHRForException fait plus que juste Get-HR-For-Exception Let8217s commencer par regarder un petit extrait de code: Cela semble parfaitement bien, à droite Pas vraiment. Il s'avère que cette API est en fait mal nommé, et il ne fait plus que simplement récupérer le HR de l'objet d'exception. L'utilisation incorrecte de cette API pourrait vous donner quelques problèmes bizarres, comme jeter une exception incorrecte, ancienne. Donc ce que l'API fait réellement Outre le fait de vous renvoyer le HRESULT, cette fonction définit également l'objet IErrorInfo thread actuel pour être l'objet d'exception. Chaque thread a un objet COM IErrorInfo associé, par défaut à NULL. Cet objet IErrorInfo représente l'échec du dernier appel de l'API COM, qui ressemble en quelque sorte à l'API GetLastError () Win32 ou errno C api. À partir de l'objet IErrorInfo, vous pouvez obtenir plus d'informations telles que la description de l'erreur, le contexte du fichier d'aide, etc., qui vous donne plus d'informations sur l'erreur. En définissant l'objet IErrorInfo à l'objet d'exception (en fait le paramètre à l'implémentation IErrorInfo de l'objet d'exception, qui est partagé par tous les objets gérés), vous êtes essentiellement dire à vos appelants COM, quothy, il ya un échec, it8217s cet objet d'exception et Vous devriez faire quelque chose à ce sujet, ce qui est évidemment une mauvaise idée si vous voulez seulement récupérer le HR. Dans de nombreux cas, cela pourrait passer inaperçu, si votre COM callercallee gère IErrorInfo correctement. Par quotcorrectlyquot, je veux dire qu'ils suivent le protocole COM IErrorInfo, qui sont fondamentalement: 1. L'appelant utiliser IErrorInfo du thread actuel lors de l'appel d'une interface COM qui dit explicitement quotI support IErrorInfoquot 2. L'appelé (qui implémente l'interface COM) qui dit QuotI support IErrorInfoquot, doit clearset IErrorInfo avant de retourner. Ceci est très similaire à GetLastError () errno, right Si c'est le cas, le IErrorInfo incorrectement mis en place dans le thread, serait soit overwrittencleared par une implémentation d'interface prenant en charge IErrorInfo, soit ignoré. Toutefois, parce que le protocole que j'ai décrit n'est en fait pas très bien compris par chaque développeur COM, I8217ve souvent vu cas où le composant COM dire quotsure, je soutiens IErrorInfo sur chaque interface COM, et ils don8217t setclear IErrorInfo à tous. Et puis, l'appelant de cette interface COM mal implémenté, finirait par utiliser l'IErrorInfo mis par GetHRForException appel plus tôt, et est conduit à croire qu'il ya une erreur. Par exemple, let8217s envisager le scénario suivant: Certains COM composant A appelle dans le code code jeter une exception, disons IOException code attrape l'exception, et appelez Marshal. GetHRForException, qui met IErrorInfo à cette exception IOException code appelle dans un autre composant COM B, les appels Dans IB. Func IB. Func a échoué et renvoyer un code d'échec de ressources humaines, disons EOUTOFMEMORY CLR voit le code d'échec de ressources humaines, et demandez le composant COM B quotdo vous supporter IErrorInfoquot, et B répond quotsure, pourquoi notquot, sauf qu'il doesn8217t vraiment le soutenir et Il doesn8217t setclear IErrorInfo CLR récupérer IErrorInfo, et voit qu'il est en fait une exception gérée, et jette l'exception IOException au lieu de OutOfMemoryException. Maintenant, vous pourriez vous demander: Qu'est-ce que cette API est vraiment destiné pour, en premier lieu Il est effectivement utilisé dans les endroits dans interop COM, où vous voulez retourner le HRESULT et IErrorInfo set par vous-même. Ce doesn8217t arrive très souvent 8211 la plupart des gens seraient assez heureux de laisser COM interop prend soin de cette partie en convertissant Exception à HR et IErrorInfo (qui, arrive à appeler Marshal. GetHRForException). Donc, à moins que vous ne sachiez vraiment ce que vous faites, mon conseil est de rester loin de Marshal. GetHRForException. Que faire si vous voulez vraiment obtenir le HRESULT pour une exception spécifique Vous devez utiliser la propriété Exception. HResult.


No comments:

Post a Comment