English 中文(简体)
显示重新投掷的例外情况,而不是从扔 throw点 trace痕。
原标题:Showing stack trace of exception that is re-thrown, rather than stack trace from throw point
  • 时间:2009-09-01 18:59:59
  •  标签:

我在2005年5月确认这一行为,因此我错了把它称作“网络”(1.1)bug。

我把原来的问题留给了下面,但我经过修订的问题是:我如何利用视频演播室向我提供我所发现和重新投掷的“ exception光”的痕迹,而不是仅仅显示从<条码>到<>>>>

情况是,我决定在运行时间上,全球例外手是否在起飞——如果放弃的话,我就希望VS赶上这一例外情况,以便我能通过呼吁站出来指出什么错误。

此前,全球例外的手稿要么编入方案,要么没有编入方案。 但局势发生了变化,我们现在需要暂时决定——它像我一样,需要回头去做这种事情的宏观方法,而没有宏观办法:

if (allow_bubble_up)
{
    Foo();
}
else
{
    try
    {
        Foo();
    }
    catch (Exception e)
    {
       GlobalExceptionHandler(e);
    }
}

但我觉得extremely against DRY。


显然,在NET1.1中,如果你有一个空洞的<条码>第说明,重新排入一个被抓住的例外情况,则从该<条码>第

更具体地说,QuickWatch的StackTrace 财产 除外/显示了正确的数据,但VS的“呼唤Stack”窗口只显示向 throw声明的层次上的呼声。

在这种样本代码中,我只能看到<代码>Main的1级全方位追踪,尽管我should。 参看一对夫妇要求<代码>的痕迹。 Foo

static public void Foo(int i)
{
    if (i > 4)
    {
        throw new ArgumentOutOfRangeException();
    }
    Foo(i + 1);
}

static void Main(string[] args)
{
    bool allow_bubble_up = true;
    try
    {
        Foo(0);
    }
    catch (Exception e)
    {
        if (allow_bubble_up)
        {
            // stack trace just shows Main
            throw;

            // also just shows Main
            //throw new Exception("asdf", e);

            // STILL just shows Main
            //throw e;
        }
        else
        {
            System.Console.WriteLine(e);
        }
    }
}

Fabrice Marguerie s blog 表明了如何围绕重新投掷的 st光进行某种工作,例如2.0+,在底线上,他说要检查。 Chris 泰勒对如何做到这一点表示歉意。 NET 1.1。 我不得不在以下网址上查询:,在档案中加以限定。 页: 1 我正确地执行了这一计划,但我仍然只停留在主线上——他的解释是可怕的,我更喜欢使用代码基数(用另一种方法计算现有的一套功能)的我。

我可以看到在被抓获和再处理例外的特性方面有正确的痕迹,但VS所显示的令人难以置信的痕迹是无用的,因为它只是从<代码>第<>throw>发言中追踪。 如果我从来不追捕和重新接纳这一例外情况,那么,我do就获得全面和适当的追踪。

How do I get the right stack trace displayed in VS? I m hoping there s some sort of simple workaround, and that I ve just been searching the wrong terms.

不幸的是,它必须是VS2003+ C# for this.

如果情况不明确,这里需要一幅屏幕(也许需要右翼和视像):

alt text http://img257.imageshack.us/img257/1124/40727627.png

最佳回答

由此可见,如果你知道搜查的正确条件,我就试图解决这一问题。 在MSIL,它称作《过滤<>除外>,it is,可在VS <2003/a>查阅。

视力基础。 NET有一个称为“渔获时”的建筑,它只能在特定的上游通行证下捕获。 。 这一MSDN blog在VB的捕获时间工作方面有了一个很好的例子。 NET诉C# s渔获量(如地雷)的结果。

最后,MSDN有一个名为Exception Filter Inject的工具,可用于“为没有例外过滤支持的语文(例如C#)提供例外过滤支持”——捕获量是指它在现有组装上运行,因此如果你最终使用该组,它就会在建筑过程中引入一个宽点。


在我发现例外证据之前 顺便说一句,我最后执行了一个由“功能”代表和“副渔获物”代表组成的短职能,如果允许例外情况消化,则只称之为功能性功能,将捕获代表称为一种排他性的例外。

我的放弃了,即有些事情导致我找到例外过滤器,这样就能够确定临时捕获的例外情况类型——如果例外情况本来可以放弃的话,我会试图追捕一个永远不会被援引的分级例外,否则我会只是陷入一个基本的例外情况。 我确实不敢肯定,如果在NET1.1中能够做到这一点,因为这基本上需要一种通用的——但也许有可能产生反省,我从来就在我的研究中就没有这么说。

问题回答

视像演播室将展示其stops的位置。

如果是unhandled,则该例外情况将停止。 页: 1 但是,如果你的代码处理这一例外情况,那么视觉演播室会你知道你做了些什么,忽略了这一例外。 只有在主(主)重新投下这一例外情况时,才会有这种例外,因为你没有在你的方案中处理这一例外。

如果你想在视力演播室中捕获最初的例外,你有两个选择:

  • 你们的法典中没有例外。 视力演播室缺省只能停留在unhandled的例外情况下。 这当然意味着你的方案在日常工作中获得了例外处理,因此没有非常有用的方法!

  • 你们的法典被用来追捕和重新接纳例外情形(正如你正在做的那样),但把视力演播室召集起来,以阻止在内部例外首次被推翻时停止。 Go to Debug>Exceptions and psing the "common 语学时间的例外情况(为了停止任何例外),或浏览子树,以便允许对特定例外情形进行例外处理(hint:如果你知道例外名称,就打了Find.hton,并进入名称的一部分,例如“File notFound”,以便迅速找到例外。 如果你在审查例外情况细节后选择继续执行死刑,那么,这将使得VS停止在内部的例外情形中,而只能转向你的捕获{}说明。

你可以提出新的例外,将例外作为内例。 然后读到内例的背部。

如果我理解你的信息,那么(也许不是由你,而是由他人阅读你的信息)在准确的错误痕迹与现在的某个特定时间点(不是你想要的)呼声之间存在混淆。

然而,一旦你例行处理例外情况, F例行工作就已完成,因此,我可以看看它如何成为你目前呼吁的一部分。

除了第一个例外的允许休息之外,我还看看看这如何奏效,不知道VS2003或VS2005将帮助做到这一点。 (5月5日,VS2010年,新的 de/作用特征)

你重新描述的是“呼唤Stack”窗口的预期行为。 当视力演播室由于无操作的外观而在<代码>throw线上停播时,从<代码>trow开始便宜进行点击。

它向“Series”视像仪“Stack Window”播下了oil子,了解你特例中的ack痕。





相关问题