所以我试图在我的应用程序中添加“AppDomain.CurrentDomain.UnhandledException
”处理程序,如果我将错误记录到文本文件中,它就可以了。但是当我尝试使用MessageBox时,它永远不会弹出。它是.Net中的另一个错误吗?任何想法?
这是我的代码示例:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
这是我的处理程序方法:
static void CurrentDomain_UnhandledException (object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
MessageBox.Show("Whoops! Please contact the developers with "
+ "the following information:\r\n\r\n" + ex.Message + ex.StackTrace,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
编辑:我已经尝试了所有可能的选项,但我仍然看不到MessageBox。现在的问题是,当我从Visual C#(调试模式)运行它时,它完美地显示了该框。但是当我直接从调试/发布文件夹运行应用程序时,它没有显示MessageBox,并且应用程序继续运行,就像没有发生错误...
答案 0 :(得分:1)
这种情况可能是因为Unhandled
Exceptions
导致应用程序以静默方式终止,UnhandledExceptionEventHandler
处理非UI线程异常。
请参阅Application.SetUnhandledExceptionMode方法,AppDomain.UnhandledException事件和Application.ThreadException事件
修改强>
尝试按照第一个链接设置Application.SetUnhandledExceptionMode
:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //add this line
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
答案 1 :(得分:1)
此示例适用于调试模式和发布模式,不论是否为vs2010:
using System;
using System.Windows.Forms;
namespace WinFormsStackOverflowSpielWiese
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static void Main() {
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
try {
var exception = e.Exception != null ? e.Exception.Message + e.Exception.StackTrace : string.Empty;
MessageBox.Show("Whoops! Please contact the developers with the following information:\r\n\r\n" + exception,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally {
Application.Exit();
}
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
try {
var exception = e.ExceptionObject is Exception ? ((Exception)e.ExceptionObject).Message + ((Exception)e.ExceptionObject).StackTrace : string.Empty;
MessageBox.Show("Whoops! Please contact the developers with the following information:\r\n\r\n" + exception,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally {
Application.Exit();
}
}
}
}
表单的代码
编辑现在有一个计时器,结果相同....
using System.Windows.Forms;
namespace WinFormsStackOverflowSpielWiese
{
public partial class Form1 : Form
{
private System.Threading.Timer myTimer;
public Form1() {
this.InitializeComponent();
this.myTimer = new System.Threading.Timer(state =>
{
var i = 0;
var s = 100 / i;
}
, null, 5000, 5000);
}
}
}