如果我有类似以下的方法链:
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
答案 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行