我希望能够在调试时像Visual Studio 2008的菜单Debug/Exception Dialog中一样,在异常出现时中断程序...但是我的程序在我希望调试的部分之前,可能会有许多有效的异常。
因此,是否可能使用#pragma或其他方法自动地启用和禁用它,而只在特定的代码段中发生?
因此,是否可能使用#pragma或其他方法自动地启用和禁用它,而只在特定的代码段中发生?
public class Foo
{
[DebuggerNonUserCode]
public void MethodThatThrowsException()
{
...
{
}
将你的 try catch 块包裹在 #if DEBUG 中
public void Foo()
{
#if DEBUG
try
#endif
{
//Code goes here
}
#if DEBUG
catch (Exception e)
{
//Execption code here
}
#endif
}
我喜欢将大括号放在#if之外,因为这样可以在调试内部或外部时保持代码处于同一范围。
如果您仍想要异常处理但需要更多详细信息,您可以这样做
try
{
//code
}
catch (FileNotFoundException e)
{
//Normal Code here
#if DEBUG
//More Detail here
#endif
}
#if DEBUG
catch (Exception e)
{
//handel other exceptions here
}
#endif
这对你来说可能有点晚了,但这是我经常试图教人们保守使用异常的最大原因。只有在发生灾难性事件且无法合理继续时才使用异常。
调试程序时,我经常打开“第一次机会异常”(调试 -> 异常)来调试应用程序。如果有很多异常发生,很难找到哪里出了“问题”。
此外,它会导致一些反模式,如臭名昭著的“catch throw”,并混淆真正的问题。有关更多信息,请参见我在博客文章中提到的内容。
就你的问题而言,你可以仅针对特定类型的异常打开第一次机会调试。除非其他异常属于相同类型,否则这应该能很好地解决问题。
bool breakLoop = false;
...
Work(); // Will not break on 5th iteration.
breakLoop = true;
Work(); // Will break on 5th iteration.
...
public void Work() {
for(int i=0 ; i < 10 ; i++) {
Debug.Assert (!(breakLoop && i == 5));
...
}
}
所以在第一次调用 Work 时,当 breakLoop 是 false 时,循环将会运行而不会断言,第二次经过循环时将会中断。