Как я уже упоминал в комментариях, я попытался на примере примера и вызвал this.Closed () внутри блока catch. Работало просто отлично. Приложение показывало окно сообщения и не показывало мне форму. Я использую .NET3.5 SP1, хотя.
Предположим, что эта ошибка возникает в более ранней версии .NET Framework. Можете ли вы попытаться выяснить, подходит ли вам что-либо из следующего или нет? Похоже, они снова работают на моей машине, но не могут гарантировать, что они будут работать на вашей.
Поместите this.Close () в блок finally, чтобы увидеть, как оно работает
finally {
if (this.loadError)
this.Close();
}
Отложите Form.Close () после завершения обработчика события Form.OnLoad.
См. Пример ниже: он не содержит анонимного делегата или лямбда-выражения для более старых версий .NET FW. Пожалуйста, прости меня за частичный урок:)
using System;
using System.Windows.Forms;
namespace ClosingFormWithException
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void InvokeDelegate();
private void Form1_Load(object sender, EventArgs e)
{
try
{
MyTroublesomeClass myClass = new MyTroublesomeClass();
}
catch (ApplicationException ex)
{
MessageBox.Show("There was a critical error. The form will close. Please try again.");
this.BeginInvoke(new InvokeDelegate(CloseTheForm));
}
}
private void CloseTheForm()
{
this.Close();
}
}
class MyTroublesomeClass
{
public MyTroublesomeClass()
{
throw new ApplicationException();
}
}
}
Используйте комбинацию 1 и 2, если 2 не работает:
finally {
if (this.loadError)
this.BeginInvoke(new InvokeDelegate(CloseTheForm));
}