6

如果我有如下方法链:

        var abc = new ABC();
        abc.method1()
           .method2()
           .methodThrowsException()
           .method3()
           ;

假设我已经定义method1()method2()并且method3()

    public ABC method1() {
        return this;
    }

并且methodThrowsException()作为

    public ABC method3() {
        throw new ArgumentException();
    }

运行代码时,是否可以知道是哪一行代码抛出了异常,还是只将所有的方法链接视为一行?我做了一个简单的测试,它似乎认为它们都只是一条线,但方法链

将方法放在单独的行上也使调试更容易,因为错误消息和调试器控制通常是逐行进行的。

我是否遗漏了什么,或者这不适用于 C#?

谢谢

编辑: 这是我目前得到的:

替代文字 http://img163.imageshack.us/img163/4503/83077881.png

4

4 回答 4

6

如果您查看作为异常详细信息的一部分显示的堆栈跟踪,您应该会看到异常的确切位置,无论您如何格式化代码。

我想如果调试器允许您在特定行上放置断点,那么以不同方式格式化代码会很有用,但是在 C# 中,断点放置在单个表达式上,所以这并没有真正的帮助。您可能需要像这样重写代码以允许放置断点:

var abc = new ABC(); 
var abc1 = abc.method1();
var abc2 = abc1.method2();
// etc...

这同样适用于突出显示当前表达式(在您的屏幕截图中)。但是,堆栈跟踪中始终提供有关异常的确切信息。

于 2010-05-21T15:13:59.267 回答
1

您可以看到生成异常的确切代码行,但调用引发异常的方法的代码行将是 2(请参见下面的编号)

         try {

Line 1        var abc = new ABC();
Line 2        abc.method1()
Line 3           .method2()
Line 4           .methodThrowsException()
Line 5           .method3();
Line 6  catch(Exception e)
        {
            StackTrace t = new StackTrace(e, true);
        }

堆栈跟踪(您可以在异常堆栈跟踪或创建 StackTrace 对象中看到它)将包含 2 帧:

  • 第一个将在定义抛出异常的方法的行和文件中

  • 第二个将在第 2 行

于 2010-05-21T15:20:18.417 回答
1

VisualStudio 调试器(我假设您使用的是 VS 而不是 Mono,因为 Mono 没有调试器)知道您的代码正在执行的实际行,并且不会像大多数 C 一样将所有语句汇总到最近的分号/C++ 调试器倾向于这样做。同样,即使您将所有语句放在同一行,VS 也能够显示正在执行的方法以及引发异常的方法。

编辑:你真的有抛出异常吗?然后查看异常堆栈跟踪。

于 2010-05-21T15:06:48.000 回答
1

如果您运行示例代码,您将看到堆栈跟踪中报告的行实际上是引发异常的行,而不是方法调用的行。VS 调试器也将在这一行停止,而不是在方法调用上。

更新:由于屏幕截图左侧的绿色错误表明您不在调用堆栈的顶部。打开调用堆栈窗口(例如,通过菜单Debug -> Windows -> CAll Stack)并双击第一行以到达实际引发异常的位置。调用堆栈上的第一个方法也将是method3().

请注意,Martin Fowler 的引用通常指的是调试,因此它可能适用于 Java IDE 或其他集成调试器,但不适用于 Visual Studio IDE。尽管如此,您将能够通过查看异常的堆栈跟踪轻松识别导致问题的方法。

于 2010-05-21T15:13:15.540 回答