编辑:Visual Studio 2015的新异常窗口比它快得多 我不再关心使用键盘的旧对话框了 它的捷径。
是否有一个宏或键盘快捷键,可以在不使用GUI的情况下切换“在抛出异常时中断”?
使用ctrl + alt + e打开对话框并检查“公共语言运行时异常”“抛出”框然后单击“确定”很简单,但这是我做了很多事情。我宁愿有一个键盘快捷键。
这个问题是重复的 Any have a Visual Studio shortcut/macro for toggling break on handled/unhandled exceptions?
然而,海报接受了一个不起作用的答案,我真的想要一个做的答案。
重复问题中的答案是不可接受的,因为它只切换一个特定的异常,而不是整个CLR组。
“好吧,然后写一个循环。”你说。但不是那么快! Someone tried that already这是无用的慢。 (是的,我已经证实它在我的系统上也很慢。)
因此,挑战在于使用宏来在不到1秒或2秒的时间内切换整个CLR例外类别。 这个问题是重复的 Any have a Visual Studio shortcut/macro for toggling break on handled/unhandled exceptions?
答案 0 :(得分:18)
与其他答案非常相似,但该组有一个特殊的ExceptionSetting。
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
答案 1 :(得分:13)
我创建了一个免费的Visual Studio扩展程序,可以可靠地执行此操作:Exception Breaker
它使用非快速的未记录IDebugSession2.SetException
调用:所有异常都在20到60毫秒内设置/取消设置。
答案 2 :(得分:4)
这是Bryce Kahle非常有用的宏,盲目更新以在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
答案 3 :(得分:2)
首先我将一个计时器初始化,然后我调用命令Exception.Debug。 当模态对话框打开时,计时器命中。 如果你使用Win 7和停用的UAC SendKeys与ALT-Key将失败...我不知道为什么。
我玩了一下......试试这个(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
'...
答案 4 :(得分:1)
好吧,我编写了一个基于VS2008 C#的插件,可以切换386个异常,每个状态切换大约需要1秒。我假设这是由于COM互操作。
这是基于您的某个链接中的VB /宏代码。我找不到更简单的C ++方法(但不能排除它)。
下一个级别是创建一个具有键盘绑定的插件,然后打开Exceptions UI,然后为您“点击”正确的复选框。
祝你好运。答案 5 :(得分:1)
您可以使用AutoHotKey之类的工具创建录制的脚本(鼠标点击或按键),然后为其分配一个热键,按下后将播放该热键...
答案 6 :(得分:1)
只是提供一些我在此发现的信息(here),因为我在搜寻网络时试图帮助...
其他人提出了同样的问题,MS Support的Gary Chang回应了这里,引用的回复是:
恐怕宏代码不行 操纵上的操作 例外对话框...
重要的是要注意这个帖子是从2005年12月开始的,所以这个回复可能不再准确;不管怎样,以为我会把它扔出去。
答案 7 :(得分:1)
为组设置特殊ExceptionSetting的建议确实切换了顶级复选框的状态。但是,它似乎没有在树中切换它下面的单个异常,而且,当我手动检查顶级复选框时,抛出此类异常时我的进程不会停止。你看到不同的行为吗?
答案 8 :(得分:1)
我的宏在运行时忽略当前的CLR异常。当调试时弹出异常时,它就像一个按钮'禁用捕获此异常类型'。
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.ControlChars
' execute Macros.MyMacros.VSDebuggerExceptions.IgnoreCurrentExceptionWhenThrown from VS Command Window
Public Module VSDebuggerExceptions
Sub BreakWhenThrown(Optional ByVal strException As String = "")
Dim dbg As Debugger3 = DTE.Debugger
Dim eg As ExceptionSettings = _
dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
eg.SetBreakWhenThrown(True, eg.Item(strException))
End Sub
' copied from Utilities module (samples)
Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane
Dim window As Window
Dim outputWindow As OutputWindow
Dim outputWindowPane As OutputWindowPane
window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
If show Then window.Visible = True
outputWindow = window.Object
Try
outputWindowPane = outputWindow.OutputWindowPanes.Item(Name)
Catch e As System.Exception
outputWindowPane = outputWindow.OutputWindowPanes.Add(Name)
End Try
outputWindowPane.Activate()
Return outputWindowPane
End Function
Private WithEvents t As Timers.Timer
' Adds the current exception to ignore list
Sub IgnoreCurrentExceptionWhenThrown()
Dim commandWin As EnvDTE.CommandWindow
commandWin = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindCommandWindow).Object
Select Case DTE.Debugger.CurrentMode
Case dbgDebugMode.dbgDesignMode
commandWin.OutputString("This macro is not enabled in Design Mode. Run it in Break Mode." + vbCrLf)
Return
Case dbgDebugMode.dbgRunMode
commandWin.OutputString("This macro is not enabled in Run Mode. Run it in Break Mode." + vbCrLf)
Return
End Select
commandWin.OutputString(Environment.NewLine)
commandWin.OutputString("Trying to get the information about current exception.." + Environment.NewLine)
Dim dbg As Debugger3 = DTE.Debugger
Dim currentExpression As Expression = dbg.GetExpression("$exception", False)
Try
Dim currentExceptionTypeString As String = currentExpression.DataMembers.Item(1).Type
commandWin.OutputString("Detected current exception type is : " + currentExceptionTypeString + Environment.NewLine)
Dim flag As Boolean = True
Dim eg As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions")
Try
eg.SetBreakWhenThrown(False, eg.Item(currentExceptionTypeString))
Catch exc As Exception
commandWin.OutputString("Cannot find this exception, trying to create.." + currentExceptionTypeString + Environment.NewLine)
'
eg.NewException(currentExceptionTypeString, New Random().Next)
eg.SetBreakWhenThrown(False, eg.Item(currentExceptionTypeString))
eg.SetBreakWhenUserUnhandled(True, eg.Item(currentExceptionTypeString))
flag = False
End Try
commandWin.OutputString(Environment.NewLine)
commandWin.OutputString("Exception '" + currentExceptionTypeString + "' added to ignore list.")
commandWin.OutputString(Environment.NewLine)
t = New Timers.Timer()
' small interval to send keys after DTE will start to exec command
t.Interval = 0.1
t.Start()
DTE.ExecuteCommand("Debug.Exceptions")
Catch exc As Exception
commandWin.OutputString("Error occured")
End Try
End Sub
Private Sub t_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles t.Elapsed
t.Stop()
' only press Ok to apply changed exceptions settings to debugger
System.Windows.Forms.SendKeys.SendWait("%t")
System.Windows.Forms.SendKeys.SendWait("{ENTER}")
End Sub
End Module
答案 9 :(得分:1)
CTRL + ALT + E. ALT + T. 输入
适合我