2010-07-09 3 views
3

Tout le concept de la gestion des exceptions me donne des maux de tête. Actuellement, ce que je veux faire, c'est gérer des exceptions spécifiques que je suis absolument certain de pouvoir gérer. D'un autre côté, je veux terminer l'application si une exception que je ne sais pas gérer est levée. Quand je place des blocs try-catch dans mon code source, ça a l'air moche car il y en a beaucoup. Existe-t-il un mécanisme global de gestion des exceptions tel qu'un événement déclenché une fois qu'une exception non gérée est levée? De cette façon, je peux afficher un message d'erreur à l'utilisateur et terminer l'application au lieu de réitérer ce processus encore et encore tout au long de mon code source.Gestion des exceptions globales dans .NET?

P.S. Je veux mettre fin à l'application dans un tel scénario parce que j'ai peur que le programme puisse commencer à fonctionner incorrectement une fois qu'une exception non gérée est levée.

Répondre

2

au moins en C# vous pouvez attribuer un global "gestionnaire d'exception non gérée" . Pour ce faire, vous devez affecter un nouveau gestionnaire à AppDomain.CurrentDomain.UnhandledException.

+0

Je vois que le gestionnaire d'événements tue le processus. Je veux montrer un contrôle d'utilisateur et le faire terminer l'application, mais le contrôle d'utilisateur n'est pas montré. La seule chose que je peux afficher est une boîte de message. – user246392

+0

Vous pouvez essayer d'invoquer une méthode publique sur votre fenêtre principale qui affiche la vue, mais je ne suis pas sûr que cela fonctionne. IIRC il y a un drapeau dans le paramètre de l'événement que vous pouvez utiliser pour déterminer si l'application doit quitter ou non. –

+0

La méthode publique ne fonctionnait que si elle contenait une boîte de message. Il semble que les boîtes de message sont spéciales. En outre, e.isTerminating est en lecture seule. – user246392

0

Créez-vous une application de formulaires gagnants ou une application Web? J'ai écrit une entrée de blog sur un Health Monitor personnalisé, par lequel vous pouvez soumettre des exceptions à une base de données. Ensuite, dans la méthode Application_Error, ajoutez du code comme celui-ci.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
    ''# Code that runs when an unhandled error occurs 
    Dim exception As Exception = HttpContext.Current.Server.GetLastError() 
    Dim emailerrors As Boolean = If(LCase(AppSettings.GetAppValue("EmailErrors")) = "yes", True, False) 
    HealthMonitor.Log(exception, emailerrors) 
End Sub 

Qu'est-ce que cela va faire est piège chaque erreur non gérée (IE:.. Erreurs en dehors de votre try/catch et les journaux à partir de là (je réoriente) vous pouvez arrêter votre application, ou faire ce que vous aimez

+0

Je construis une application WPF, mais j'ai de l'expérience dans Win Forms. – user246392

3

en VB.NET vous devez gérer l'événement My.Application.UnhandledException:

Exemple (MSDN):

Private Sub MyApplication_UnhandledException(_ 
    ByVal sender As Object, _ 
    ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs _ 
) Handles Me.UnhandledException 
    My.Application.Log.WriteException(e.Exception, _ 
     TraceEventType.Critical, _ 
     "Unhandled Exception.") 
End Sub