我正在订阅AppDomain.FirstChanceException事件,并且在发生异常时,将堆栈跟踪写入Visual Studio 2012中的Debug窗口(以及跟踪文件)。此机制用于发现开发期间的潜在问题,但未在代码的生成版本中使用。
但是,我得到了第一次机会异常记录,只有在Visual Studio中调试并遇到断点时才会发生。例如:
First chance exception of type [ThreadAbortException]
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.VisualStudio.Debugger.Runtime.Main.ThrowCrossThreadMessageException(String formatString)
at System.Windows.Forms.SafeNativeMethods.GetWindowTextLength(HandleRef hWnd)
at System.Windows.Forms.Control.get_WindowText()
at System.Windows.Forms.Form.get_WindowText()
at System.Windows.Forms.Control.get_Text()
at System.Windows.Forms.Form.get_Text()
at System.Windows.Forms.Form.ToString()
at Test.Form1.<Form1_Load>b__3(Object obj)
at System.Action`1.Invoke(T obj)
at Test.MyClass.<DoStuff>b__13(Object obj)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
请注意,我的代码在任何时候都不与表单进行交互。
我的问题是,是否有一种可靠的方法来确定异常纯粹是因为调试,所以我的日志代码可以忽略它?我可以在堆栈跟踪中查找字符串'Microsoft.VisualStudio.Debugger',但我不确定是否会捕获可能出现问题的所有情况。
要明确的是,我对所显示的特定异常的原因不感兴趣,只是在寻找一种方法来清除由调试引起的异常。
我无法发布代码,因为没有一些我无法发布的支持代码就没有意义。我不是要寻求解决异常 - 这在调试时会发生,但不会发生 - 只是为了确定我是否可以在AppDomain.FirstChanceException事件的事件处理程序中识别源自调试器的第一次机会异常。
这是一个天真的例子:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Foo foo = new Foo();
}
}
public class Foo
{
public string Oops { get { throw new Exception("Oops"); } }
}
创建foo后的断点并在本地窗口中展开foo。显然这会导致异常,但是在visual studio之外运行代码却不会。