抛出异常时,C#应用程序无提示失败

时间:2018-01-14 12:01:35

标签: c# debugging exception exception-handling

我创建了一个小的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()

但这并不是一个很大的帮助!

对于一堆应用程序会发生这种情况,我觉得我有一些系统范围的设置会抑制这个系统对话框,但我不知道它可能是什么!任何指导都将不胜感激。

2 个答案:

答案 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