2009-06-19 8 views
18

Placez ce code quelque part dans une solution VSTO niveau de document Word en dehors de ThisDocument_Startup (créer un bouton de ruban, avec un événement de clic):Word VSTO avale des exceptions lors de l'exécution sans débogage?

int zero = 0; 
int divideByZero = 10/zero; 

Démarrer sans débogage (Ctrl + F5), Résultat: Exception est avalée, le reste du code échoue silencieusement.

L'exception sera visible si elle est placée dans ThisDocument_Startup, mais elle n'apparaît nulle part ailleurs. Les forums VSTO de Microsoft et la documentation MSDN semblent avoir l'air Try ... Catch devrait être utilisé - ce qui n'est pas un gros problème pour les inconnus connus. Qu'en est-il des inconnues inconnues?

Toutes les voies communes de traitement des exceptions non gérées pour le code managé ne semble pas fonctionner, probablement à cause de VSTO en utilisant le code managé avec Office COM INTEROPS:

//These don't work 
AppDomain.CurrentDomain.UnhandledException ... 
System.Windows.Forms.Application.ThreadException ... 

J'ai lu les messages au sujet de dépannage VSTO code qui semble toujours conduire à placer Try ... Attraper pratiquement tout!

Existe-t-il une meilleure façon de gérer les défaillances connues et inconnues (désormais invisibles et silencieuses!)?

+0

soyez prudent, le Word essayera également de désactiver le complément qui jette des exceptions;) – Tangocoder

Répondre

10

En fait, il est assez facile de définir la variable d'environnement VSTO_SUPPRESSDISPLAYALERTS sur 0 avant d'exécuter l'application Office, puis Office affichera des exceptions et ne supprimera pas votre complément au démarrage en cas de problème.

Il y a aussi un script Powershell utile qui fera ce genre de choses pour vous et est à portée de main au moment de déterminer quand VSTO ne fonctionne pas à http://archive.msdn.microsoft.com/vstotroubleshooter Commencez en exécutant vstotroubleshooter.ps1 setdbg qui installera la variable d'env VSTO_SUPPRESSDISPLAYALERTS pour vous

+1

Le lien http://archive.msdn.microsoft.com/vstotroubleshooter ne fonctionne pas. Il dit "La galerie d'archives a été retirée." – N30

0

je peux obtenir un texte ************** d'exception ************** System.DivideByZeroException: Tentative de division par zéro.

avec le projet addin au niveau de l'application.

Ne voyez-vous cela qu'avec des projets de personnalisation de niveau Doc? Aussi seulement en word ou est-ce que cela se passe aussi dans Excel?

+0

Je m'excuse pour mon imprécision - oui, seulement pour des projets de niveau Doc dans Word. –

2

Je pense que le problème est isolé seulement des exceptions dans le « complément interface utilisateur » - qui se trouve être un réglage direct trouvé ici (Word 2007):

Options Word> Avancé> Général> « Afficher erreurs d'interface utilisateur de complément "

+0

Savez-vous s'il existe une option équivalente pour Word 2003? J'ai du mal à obtenir une gestion d'exception adéquate dans un add-in VSTO MS Word Application. J'ai ajouté les gestionnaires d'exceptions selon votre question, mais ils ne se déclenchent jamais ... –

+0

Je n'en connais pas en 2003. Pour nos applications VSTO dans Office 2007, nous avons dû essayer avec soin ... rattraper tout avec journalisation et démontage sécurisé pour les exceptions inconnues. –

+0

Merci Mike. J'ai remarqué que votre question concernait les compléments de niveau doc. Avez-vous effectué des compléments au niveau de l'application et avez-vous réussi à obtenir des gestionnaires d'erreurs globaux pour les compléments d'application VSTO, ou avez-vous essayé de tout essayer pour eux aussi? –

0

J'ai eu le même problème avec un complément d'application dans Word.

Si vous utilisez votre complément en le lançant à partir de Visual Studio avec F5, vous aurez toujours « non gérée par le code utilisateur » dans VS (par exemple 2008 SP1), à moins que:

  • vous désélectionnez le paramètre Visual Studio "Break lorsqu'une exception est .. user-unhandled" pour les exceptions CLR, ou

  • vous appliquez généreusement l'annotation [System.Diagnostics.DebuggerNonUserCodeAttribute()].

Une fois que vous avez fait un de ces derniers, UnhandledException/ThreadException semblent fonctionner.

Questions connexes