我创建了一个小的winforms应用程序,它在启动时抛出异常:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
throw new Exception("lol");
Application.Run(new Form1());
}
当我从调试器运行它时,会抛出异常,正如我所料。如果我浏览到bin目录中的可执行文件并从explorer运行,则应用程序只是静默失败而不显示“此应用程序已崩溃对话框”。
我确实在事件查看器中记录了异常:
Application: WindowsFormsApplication1.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception
at WindowsFormsApplication1.Program.Main()
但这并不是一个很大的帮助!
对于一堆应用程序会发生这种情况,我觉得我有一些系统范围的设置会抑制这个系统对话框,但我不知道它可能是什么!任何指导都将不胜感激。
答案 0 :(得分:1)
据我所知,WinForms应用程序只在
时启动Application.Run(new Form1());
打电话。它没有控制台输出,它会尝试通过WinForms UI告诉你一切。但在这一点上它没有一个。
如果希望应用程序显示任何内容,则必须确保启动消息循环。因此,如果要在应用程序启动时立即抛出异常,请覆盖表单的OnLoad方法并在其中抛出异常。 (我将代码从Program.cs移到了表单的代码隐藏)
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
throw new ApplicationException("ASDF");
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//AllocConsole();
//Console.WriteLine("BOOO");
//throw new ApplicationException("BOOOO");
Application.Run(new Form1());
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();
}
}
这会给你一个“漂亮”的异常窗口。
或编写控制台应用程序。 :)
如果必须,您可以尝试分配控制台输出:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
AllocConsole();
Console.WriteLine("BOOO");
throw new ApplicationException("BOOOO");
Application.Run(new Form1());
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();
}
}
但恕我直言,让应用程序启动,然后在它应该使用的UI上处理问题,将是更清洁的方法。
答案 1 :(得分:0)
尝试处理appdomain未处理的excpetionevent。
public static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception) args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
}
https://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(v=vs.110).aspx