簡體   English   中英

斷言在C#WPF應用程序的Visual Studio 2010中不起作用

[英]Asserts not working in Visual Studio 2010 in a C# WPF application

我不知道這是我已打開還是關閉的設置,或者是否有我以某種方式鏈接的代碼將其關閉,但是Debug.Assert不再停止執行。 我所得到的只是“輸出”窗口中的堆棧跟蹤,如下所示:

The thread '<No Name>' (0x155c) has exited with code 0 (0x0).
The thread '<No Name>' (0x24f4) has exited with code 0 (0x0).
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----

---- Assert Long Message ----


    at ...
    at CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e)  
    at CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding)  
    at CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute)  
    at CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute)  
    at CommandManager.OnExecuted(Object sender, ExecutedRoutedEventArgs e)  
    at RoutedEventArgs.InvokeHandler(Delegate handler, Object target)  
    at EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)  
    at UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)  
    at RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated)  
    at MenuItem.InvokeClickAfterRender(Object arg)  
    at ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)  
    at ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)  
    at Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)  
    at DispatcherOperation.InvokeImpl()  
    at ExecutionContext.runTryCode(Object userData)  
    at RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)  
    at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)  
    at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)  
    at DispatcherOperation.Invoke()  
    at Dispatcher.ProcessQueue()  
    at Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)  
    at HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)  
    at HwndSubclass.DispatcherCallbackOperation(Object o)  
    at ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)  
    at ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)  
    at Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)  
    at Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)  
    at HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)  
    at UnsafeNativeMethods.DispatchMessage(MSG& msg)  
    at Dispatcher.PushFrameImpl(DispatcherFrame frame)  
    at Application.RunInternal(Window window)  
    at Application.Run()  
    at App.Main()
    at AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)  
    at HostProc.RunUsersAssembly()  
    at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)  
    at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)  
    at ThreadHelper.ThreadStart()  

統計:

  • Visual Studio 2010
  • WPF應用
  • C#
  • .Net 4.0

有誰知道為什么沒有彈出“斷言失敗”消息框?

Debug.AssertMSDN頁面上

消息框的顯示取決於DefaultTraceListener的存在。 如果DefaultTraceListener不在Listeners集合中,則不會顯示該消息框。 可以通過for的Element,for的Element或通過在Listeners屬性(System.Diagnostics.Trace.Listeners.Clear())上調用Clear方法來刪除DefaultTraceListener。

就是說,一個可以在有斷言的情況下發送消息的消息框的實現一直困擾着我。 我認為.Net趨向於很好地工作,但是由於在其他情況下發生這種情況,我已經失去了不可恢復的狀態。 對於我自己的.Net項目,我傾向於使用自己的靜態Assert類,但不能這樣做。 相反,當我的斷言失敗時,我調用Debugger.Break()。

例如

internal static class Assert 
{
    [Conditional("DEBUG")]
    public static void IsNotNull<T>(T obj) where T : class
    {
        if (obj == null)
            System.Diagnostics.Debugger.Break();
    }
}

綁定內的異常的處理方式有所不同。 您也只會在輸出窗口中看到綁定錯誤(異常)。 這是一個變化。

您可以在其他地方拋出測試異常以檢查設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM