我将一个简单的ArgumentException
编码为:
if (String.IsNullOrEmpty(value))
{
throw new ArgumentException("Name cannot be null or empty");
}
现在,当我使用空字符串运行程序来测试此异常是否正常运行时,调试器会将我带回MS Visual Studio,如下所示:
throw new ArgumentException("Name cannot be null or empty");
虽然我实际上希望Console
在控制台窗口中向我显示错误消息及其详细信息。 Console
显示的是一个空窗口。
知道如何在控制台窗口中显示异常错误详细信息吗?
答案 0 :(得分:2)
throw new ArgumentException("Name cannot be null or empty");
如果在代码中抛出异常并且在任何调用方法中都没有try / catch语句,那么程序将无条件地崩溃。使用调试器(F5)运行时看到的情况应该是有用的。它可以让您诊断程序即将崩溃的原因。虽然这个特殊情况不应该让你感觉太多,但是当你没有想到这个例外时,你会更喜欢它。
如果你在没有调试器(Ctrl + F5)的情况下运行,那么将会发生什么取决于.NET版本。对于v2.0到3.5,您将不获得任何诊断。弹出Windows WER对话框,告诉用户程序崩溃时出现类似“ConsoleApplication1停止工作”的消息。提供告诉微软有关崩溃的信息,以便他们可以修复代码中的错误。没用:)
如果在v4.0及更高版本上运行,则CLR会将异常消息和堆栈跟踪打印到控制台窗口,然后显示WER对话框。可能你喜欢什么。
通常,您不希望让它达到这个目的,并确保生成合理的诊断消息,而不管.NET版本如何。如果没有WER对话,那就太过于“你失败”的耻辱。您可以通过订阅AppDomain.UnhandledException事件来完成此操作,如下所示:
static void Main(string[] args) {
if (!System.Diagnostics.Debugger.IsAttached) {
AppDomain.CurrentDomain.UnhandledException += ReportUnhandledException;
}
// Rest of code
//...
throw new Exception("Kaboom"); // Test
}
private static void ReportUnhandledException(object sender, UnhandledExceptionEventArgs e) {
Console.WriteLine();
Console.WriteLine("We're very sorry, this program unexpectedly failed.");
Console.WriteLine("Please include the following information in your support request:");
Console.WriteLine();
Console.WriteLine(e.ExceptionObject.ToString());
Console.WriteLine();
Console.Write("Please press any key to end the program");
Console.ReadKey();
Environment.Exit(1);
}
您可以使用此代码执行更多操作,例如记录异常,以便有永久记录。或者通过电子邮件发送信息,这样您就可以在不在现场的情况下了解代码所发生的情况,从而帮助您确保应用防弹。
请注意此代码段中的Debugger.IsAttached检查。它确保调试器仍然有助于诊断未处理的异常。您可以删除该检查以获得您要求的内容。你不应该。
答案 1 :(得分:1)
您可以通过打开菜单Debug - >为ArgumentException
添加例外。例外(Ctrl + D, E
)。解开"投掷"和"用户未处理"。
现在,当抛出ArgumentException时,Visual Studio不会中断。