1

ユーザーがアプリケーションをデバッグし、未処理の例外がスローされた場合に対処する Visual Studio 用のアドインを作成しました。アプリケーション オブジェクトの「Events」プロパティを使用して、イベント「OnExceptionNotHandled」および「OnExceptionThrown」を登録しました。ドキュメントでは、これらのイベントは「OnEnterBreakMode」の前に発生することがわかります。しかし、「ArgumentException」をスローする単純なアプリケーションをデバッグすると、イベントが発生しません。これが私のコードです(短縮):

public class Connect : IDTExtensibility2
{
    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;

            _debuggerEvents = _applicationObject.Events.DebuggerEvents;
            _debuggerEvents.OnExceptionThrown += new _dispDebuggerEvents_OnExceptionThrownEventHandler(_debuggerEvents_OnExceptionThrown);
            _debuggerEvents.OnExceptionNotHandled += new _dispDebuggerEvents_OnExceptionNotHandledEventHandler(_debuggerEvents_OnExceptionNotHandled);

    }

        void _debuggerEvents_OnExceptionNotHandled(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction)
        {
            m_panOutput.OutputString("NotHandled\n");
        }

        void _debuggerEvents_OnExceptionThrown(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction)
        {
            m_panOutput.OutputString("Thrown\n");
        }

        void _debuggerEvents_OnEnterBreakMode(dbgEventReason Reason, ref dbgExecutionAction ExecutionAction)
        {
            m_panOutput.OutputString("EnterBreakMode\n");
        }

        DebuggerEvents _debuggerEvents;

}
4

3 に答える 3

1

私の経験では、このイベントはTools/Options/Debugging/General/Enable the exception assistantが無効になっている場合にのみ発生します。この設定はデフォルトで有効になっています。

于 2012-08-14T08:34:35.453 に答える
0

確かではありませんが、基本クラスのメソッドをオーバーライドする必要があるかもしれません。

于 2011-06-07T11:12:50.477 に答える
0

Frank Koch が示唆するように、アシスタントをオフにする必要がありましたTools/Options/Debugging/General/Enable the exception。アシスタントは無効になっています。

また、この MSDN の記事で説明されている方法でイベントを接続しました。

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;

    Globals globals;
    globals = _applicationObject.Solution.Globals; 

    _debuggerEvents = globals.DTE.Events.DebuggerEvents;

    _debuggerEvents.OnEnterBreakMode += new _dispDebuggerEvents_OnEnterBreakModeEventHandler(BreakHandler);
    _debuggerEvents.OnExceptionThrown += new _dispDebuggerEvents_OnExceptionThrownEventHandler(_debuggerEvents_OnExceptionThrown);
    _debuggerEvents.OnExceptionNotHandled += new _dispDebuggerEvents_OnExceptionNotHandledEventHandler(_debuggerEvents_OnExceptionNotHandled);

...
}


void _debuggerEvents_OnExceptionNotHandled(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction)
{
    Debug.WriteLine("NotHandled\n");
}

void _debuggerEvents_OnExceptionThrown(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction)
{
    Debug.WriteLine("Thrown\n");
}
于 2016-11-01T04:38:21.487 に答える