我在C#中有一个命令行程序,我用try-catch块包装,以防止它崩溃控制台。但是,当我调试它时,如果在DoStuff()方法的某处抛出异常,Visual Studio将在“catch”语句中中断。我希望Visual Studio能够打破异常发生的位置。最好的方法是什么?
评论试试?
Visual Sudio中的设置?
#if DEBUG语句?
static void Main(string[] args)
{
try
{
DoStuff();
}
catch (Exception e)
{ //right now I have a breakpoint here
Console.WriteLine(e.Message);
}
}
private void DoStuff()
{
//I'd like VS to break here if an exception is thrown here.
}
答案 0 :(得分:8)
您可以在VS中开启First chance exceptions。这将允许您在提出异常时立即得到通知。
答案 1 :(得分:4)
我认为将VS设置为break on uncaught exceptions并在ifdefs中包装try / catch是我将如何去做。
答案 2 :(得分:1)
有一个“打破所有例外”的选项。我不确定你使用的是什么版本的VS但是在VS 2008中你可以按Ctrl + D,E。然后你可以点击你想要打破的例外类型的Thrown复选框复选框
我相信VS的早期版本中有一个Debug菜单项,其效果为“Break on all exceptions”。不幸的是,我没有以前的版本。
答案 3 :(得分:1)
以下是我在持续集成服务器上运行的控制台工具的使用方法:
private static void Main(string[] args)
{
var parameters = CommandLineUtil.ParseCommandString(args);
#if DEBUG
RunInDebugMode(parameters);
#else
RunInReleaseMode(parameters);
#endif
}
static void RunInDebugMode(IDictionary<string,string> args)
{
var counter = new ExceptionCounters();
SetupDebugParameters(args);
RunContainer(args, counter, ConsoleLog.Instance);
}
static void RunInReleaseMode(IDictionary<string,string> args)
{
var counter = new ExceptionCounters();
try
{
RunContainer(args, counter, NullLog.Instance);
}
catch (Exception ex)
{
var exception = new InvalidOperationException("Unhandled exception", ex);
counter.Add(exception);
Environment.ExitCode = 1;
}
finally
{
SaveExceptionLog(parameters, counter);
}
}
基本上,在发布模式下,我们捕获所有未处理的异常,将它们添加到全局异常计数器,保存到某个文件,然后退出并显示错误代码。
在调试中,更多异常直接进入投掷点,另外我们默认使用控制台记录器来查看发生的情况。
PS:ExceptionCounters,ConsoleLog等来自Lokad Shared Libraries