[更新 2:问题已解决,请参阅下面的评论和我的其他帖子。希望这对某人有帮助。]
[更新:对我的另一个问题Detecting Exceptions during Beta Testing的回答,作为这个问题的基础是有缺陷的。在 Visual Studio 中,2010 和现在的 2012 都运行良好。异常处理程序被调用,好吧,在 VS 换行后我说继续。我决定在 VS2012 IDE 之外进行测试,这是一件好事。操作系统捕获错误,显示标准的“发生未处理的异常”对话框,提供详细信息以及继续和退出按钮。选择继续,只是继续应用程序而不陷入我的超级异常处理程序。选择相当,白化应用程序并显示标准关闭窗口对话框。退出按钮也不会调用我的超级处理程序。
目的是让我的异常处理程序被调用。如果我在 VS2012 IDE 中工作,我不需要超级异常处理程序。处理程序的目的是为最终用户和 beta 测试人员服务,即除我自己以外的任何人,他们不会拥有我的开发站。
下面的代码在 IDE 之外不起作用。因此,关闭应用程序和继续这两个按钮毫无意义,因为异常处理程序永远不会被调用。在 IDE 下运行并使用代码时(为什么这不是浪费我的时间?), continue 不会继续,exit 不会退出。我只是一遍又一遍地看到同样的异常。是的,我正在尝试发布的可能答案。
我真的认为这个话题会很好地用 .Net 4.5 解决。]
我添加了一个未处理的异常处理程序,它独立于我的主表单,我在 Application.Run(new frmMain()) 调用之前添加了它。处理程序按预期工作,没有问题。
问题: 1. 是否可以强制关闭/结束违规表单(基本上是关闭应用程序),如果可以,如何强制关闭?
我在主窗体上添加了一个按钮,在 OnClick 事件中,我只是简单地除以零,以便有针对性地模拟一些不好的东西。我正在使用 VS2012 调试环境运行。自然,我首先点击了 VS 提醒我的违规行,但是在继续执行时,我点击了未处理的异常处理程序。在该处理程序中,一种选择是结束执行。我执行了“Application.Exit()”,但没有效果。我一直回到那条令人讨厌的路线。
- 是否可以从异常处理程序以编程方式从下一行继续执行?
简单地返回只会让我回到那个点。
我已经知道 try/catch 块,但这里的目的是捕获我不期望的未处理异常,并且在最坏的情况下,我可以从该处理程序生成一个有意义的崩溃报告。
JMK 要求提供一些示例代码,但并不确定这会带来什么。
我抛出一个对话框以响应未处理的异常。有 4 个按钮,其中两个用于此贴。第一个按钮允许用户继续,而第二个按钮终止应用程序。至少,是这样的想法。
private void cmdContinue_Click(object sender, EventArgs e)
{
// Close this dialog and attempt to resume.
this.DialogResult = DialogResult.OK;
this.Close();
}
private void cmdExitApp_Click(object sender, EventArgs e)
{
// Close this dialog and attempt to resume.
this.DialogResult = DialogResult.OK;
this.Close();
// Exit the application.
Application.Exit();
}
continue 块,至少在 VS2012 IDE 中,只是保持在有问题的行。出口块同上。
就我的例外而言,例外可以是任何东西。这就是我写它的原因。我的专用例外只是为了测试代码,然后按钮就消失了。我正在努力努力并创建一个完美的非破坏性应用程序,但是这个目标是虚幻的,直到那个时候这个块。这种机制的另一个目的是让 beta 测试人员向我报告错误。
这是我的超快速和肮脏的未处理异常的代码。我必须很棘手,因为简单地除以零会被编译器捕获。顺便说一句,未处理的异常通常不会发生在我编写的特定行上,而是发生在方法内部对他人代码的调用中。
private void button1_Click(object sender, EventArgs e)
{
// Attempt to throw and unhandled exception to test out the unhandled exception handler.
int iDivider = 0;
int iResult = 5 / iDivider;
}
这是另一个代码块,即测试应用程序的启动。
public static frmMain FormMain = null;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Turn on global unhandled exception handling.
cExceptions.Initialize();
// Run the application load tasks manually, as Windows will not call this event until the show.
Program.FormMain = new frmMain();
Application.Run(Program.FormMain);
}
有人要我的异常处理程序,所以就在这里。基本上,微软提供了样本。
/// <summary>
/// Based on example at http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx
/// </summary>
internal static class cExceptions
{
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
public static void Initialize()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception ex = (Exception)args.ExceptionObject;
// Log the exception to disk.
// Show the exception information to the user.
using (frmExceptions oException = new frmExceptions())
{
// Set the exeption information.
oException.oEx = ex;
// Show the dialog.
oException.ShowDialog();
}
Console.WriteLine("MyHandler caught : " + ex.Message);
}
}
提前致谢。