【问题标题】:How do I get the exception to come up at the source of the exception and not the point I call Invoke?如何让异常出现在异常的源头而不是我调用 Invoke 的地方?
【发布时间】:2010-12-13 13:40:36
【问题描述】:

我编写了一个命令管理器,它使用反射来调用各种方法,它工作得非常好,只是当其中一个处理程序发生异常时,调试中断发生在命令管理器中,而不是在异常发生时原来抛出。有没有办法让它立即进入异常,而不是在我调用 Invoke 的时候?

【问题讨论】:

    标签: c# .net exception reflection


    【解决方案1】:

    你的意思是调试时?如果是,则进入 Debug 菜单 -> Exceptions,然后您可以将调试器配置为在抛出异常时中断,而不是在捕获异常时中断。

    您可以为所有异常启用该功能,或者如果您知道您感兴趣的异常类型,那么您可以只为该异常启用它。

    【讨论】:

    • 因为命令管理器可以执行任何命令,所以异常类型未知。这不会对其他类型的异常捕获产生不利影响。我只希望通过 Invoke 的调用中断调用它的位置。否则我会捕捉到最终会被处理的各种异常,不是吗?
    【解决方案2】:

    通过选择 Debug->Exceptions 打开 Exceptions 设置窗口。

    在那里,您可以找到正在引发的 CLR 异常。您可以将设置更改为在抛出异常而不是用户未处理时中断。

    这会让它在适当的时候中断。

    【讨论】:

    • 因为命令管理器可以执行任意命令,所以异常类型未知。
    • 不幸的是,这正是 .NET 中调试器的工作方式。如果它们在后台线程中,你不能让它在抛出异常时中断,等等......这很好,但它实际上只是一个或另一个。话虽如此,我对此并不在意——内部异常信息具有正确的堆栈跟踪和正确的行号,因此很烦人,但实际上并不需要调试问题。
    • 这就是我一直在解决的问题,但这也意味着我没有为调用获得正确的堆栈,这意味着我必须希望异常足够一致以至于它会发生下次我在抛出代码上设置断点之后。关于您对另一个线程的评论,我相当肯定这一切都发生在一个线程中。
    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多