42 votes

Basculez "Pause quand une exception est levée". en utilisant une macro ou un raccourci clavier

Est-il une macro ou d'un raccourci clavier qui permet de basculer "casser quand une exception est levée" sans l'aide de l'interface graphique?

L'ouverture de la boîte de dialogue avec ctrl+alt+e et la vérification de la "Common Language Runtime Exceptions" "Levée" de la boîte puis en cliquant sur OK est assez simple, mais c'est quelque chose que je fais beaucoup. Je préférerais avoir un raccourci clavier pour cette.

Cette question est un doublon de Une Visual Studio raccourci/macro permettant de briser traitées/les exceptions non gérées?

Toutefois, l'affiche accepté une réponse qui ne fonctionne pas vraiment, et j'aimerais vraiment une réponse qui n' travail.

La réponse à la double question n'est pas acceptable, car il permet de basculer d'une seule exception, et non la totalité de la CLR groupe.

"Bien écrire une boucle." dites-vous. Mais pas si vite! Quelqu'un a essayé déjà et c'était inutilement lente. (Oui, j'ai vérifié que sa lente sur mon système.)

Le défi est donc d'utiliser une macro pour faire basculer l'ensemble de la CLR catégorie Exceptions à moins de 1 ou 2 secondes. Cette question est un doublon de Une Visual Studio raccourci/macro permettant de briser traitées/les exceptions non gérées?

18voto

Bryce Kahle Points 3937

Très similaire à l'autre réponse, mais il existe un ExceptionSetting spécial pour le groupe.

 Dim dbg As EnvDTE90.Debugger3 = DTE.Debugger
Dim exSettings As EnvDTE90.ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Dim exSetting As EnvDTE90.ExceptionSetting
Try
    exSetting = exSettings.Item("Common Language Runtime Exceptions")
Catch ex As COMException
    If ex.ErrorCode = -2147352565 Then
        exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
    End If
End Try

If exSetting.BreakWhenThrown Then
    exSettings.SetBreakWhenThrown(False, exSetting)
Else
    exSettings.SetBreakWhenThrown(True, exSetting)
End If
 

13voto

Andrey Shchekin Points 7740

J'ai créé une extension gratuite de Visual Studio capable de le faire de manière fiable: Exception Breaker .
Il utilise des appels IDebugSession2.SetException qui est très rapide: toutes les exceptions sont activées / désactivées dans un délai de 20 à 60 millisecondes.

4voto

Peter MacMurchy Points 146

Voici la macro très utile de Bryce Kahle mise à jour à l'aveuglette pour fonctionner dans VS2010:

 Sub ToggleExceptions()
    Dim dbg As EnvDTE100.Debugger5 = DTE.Debugger
    Dim exSettings As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
    Dim exSetting As ExceptionSetting
    Try
        exSetting = exSettings.Item("Common Language Runtime Exceptions")
    Catch ex As COMException
        If ex.ErrorCode = -2147352565 Then
            exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
        End If
    End Try

    If exSetting.BreakWhenThrown Then
        exSettings.SetBreakWhenThrown(False, exSetting)
    Else
        exSettings.SetBreakWhenThrown(True, exSetting)
    End If

End Sub
 

2voto

xks Points 41

D'abord, j'ai initialisé une minuterie puis j'ai appelé la commande Exception.Debug. Le minuteur atteint lorsque la boîte de dialogue modale est openend. Si vous utilisez Win 7 avec UAC désactivé SendKeys avec ALT-Key échouera ... Je ne sais pas pourquoi.

J'ai joué un peu ... essayez ceci (VS2010 EN):

 Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports System.Runtime.InteropServices

'...

Private WithEvents t As Timers.Timer
Private Sub t_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles t.Elapsed
    t.Stop()
    ' Tastatureingaben simulieren
    System.Windows.Forms.SendKeys.SendWait("{DOWN}")
    System.Threading.Thread.Sleep(1500) ' Pause wichtig zum Laden des Exceptionbaums
    System.Windows.Forms.SendKeys.SendWait("%t")
    System.Windows.Forms.SendKeys.SendWait("{ENTER}")
End Sub
Public Sub toggleCLRExceptions()
    If DTE.Solution.Count <= 0 Then
        MsgBox("Nicht ohne geöffnete Solution!")
        Exit Sub
    End If
    ' Timer wird benötigt, da der Dialog Modal ist
    ' und weitere Befehle im Macro werden erst nach beenden des Dialogs ausgeführt
    t = New Timers.Timer()
    t.Interval = 0.5
    t.Start()
    DTE.ExecuteCommand("Debug.Exceptions")
    'System.Windows.Forms.SendKeys.SendWait("^%e") ' alternativ: STRG+ALT+e
    System.Threading.Thread.Sleep(200)
    If isCLRExceptionsActive() Then
        MsgBox("BREAK @CLR-Exception", MsgBoxStyle.Information, "Info")
    Else
        MsgBox("NO BREAK @CLR-Exception", MsgBoxStyle.Information, "Info")
    End If
End Sub

Function isCLRExceptionsActive() As Boolean
    ' prüft, ob Setting Debug CLR-Exceptions aktiviert/deaktivert ist
    Dim dbg As EnvDTE100.Debugger5 = DTE.Debugger
    Dim exSettings As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
    Dim exSetting As ExceptionSetting
    Try
        exSetting = exSettings.Item("Common Language Runtime Exceptions")
    Catch ex As COMException
        If ex.ErrorCode = -2147352565 Then
            exSetting = exSettings.NewException("Common Language Runtime Exceptions", 0)
        End If
    End Try
    Return exSetting.BreakWhenThrown
End Function

'...
 

1voto

Simeon Pilgrim Points 4263

Eh bien, j’ai écrit un plug-in basé sur VS2008 C # qui bascule les exceptions 386 et prend environ 1 seconde par bascule. Je suppose que cela est dû à COM inter-op.

Ceci était basé sur le code VB / macro dans l'un de vos liens. Je ne pouvais pas trouver une méthode C ++ plus simple (sans l'exclure).

Le niveau suivant consiste à créer un plug-in avec une liaison au clavier, qui ouvre ensuite l'interface utilisateur des exceptions, puis "clique" sur la case à cocher appropriée.

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X