C#中的方法链接和异常

时间:2010-05-21 15:01:19

标签: c# exception method-chaining

如果我有类似以下的方法链:

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

假设我已将method1()method2()method3()定义为

    public ABC method1() {
        return this;
    }

methodThrowsException()

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

运行代码时,是否可以知道哪个特定的代码行抛出了异常,或者只是将所有方法链接视为一行?我做了一个简单的测试,它似乎只将它们视为一行但Method Chaining表示

  

也将方法放在单独的行上   使调试更容易出错   消息和调试器控件是   通常是逐行的。

我错过了什么,或者这不适用于C#?

由于

修改 这是我目前得到的:

alt text http://img163.imageshack.us/img163/4503/83077881.png

4 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

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

编辑:您实际上是否会抛出异常?然后查看异常堆栈跟踪。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分: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(您可以在异常堆栈跟踪中或通过创建StackTrace对象看到它)将包含2个帧:

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

  • 第二个将在第2行