Исключительная ситуация при отладке проекта из IDE, но не при запуске вне IDE - PullRequest
3 голосов
/ 30 июня 2010

В C #, WinForms, VS2008, .NET 3.5 ...

Для этого кода:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormThatDividesByZero());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
}

public partial class FormThatDividesByZero : Form
{
    public FormThatDividesByZero()
    {
        InitializeComponent();
    }

    private void DivideByZeroButton_Click(object sender, EventArgs e)
    {
        // Create a divide by zero exception.
        int a = 0;
        int b = 0;
        int c = a / b;
    }
}

Полный источник: http://forgefx.com/posts/ExceptionReporting.zip

Когда я запускаю этот небольшой тестовый проект через F5 из среды разработки, возникает исключение после нажатия кнопки DivideByZero и запускается окно сообщения. Когда я запускаю проект, дважды щелкнув по файлу .exe в папке / bin / Debug, исключение не перехватывается и отсутствует окно сообщения - почему это так?

Когда .exe запускается из-за пределов IDE или с помощью «Отладка> Запустить без отладки» из Visual Studio, я получаю необработанное исключение. Насколько я понимаю, приведенный выше код будет перехватывать все исключения.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Это не хороший способ отловить глобальное исключение.Вы можете использовать AppDomain или объект Application, чтобы поймать его.Этот объект перехватывает все необработанные исключения и события вызова.

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormThatDividesByZero());            

    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Exception ex = (Exception)e.ExceptionObject;
        MessageDialog.Show(ex.Message);
        Application.Exit();
    }

    void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        MessageDialog.Show(e.Exception.Message);
    }
}



public partial class FormThatDividesByZero : Form
{
    public FormThatDividesByZero()
    {
        InitializeComponent();
    }

    private void DivideByZeroButton_Click(object sender, EventArgs e)
    {
        // Create a divide by zero exception.
        int a = 0;
        int b = 0;
        int c = a / b;
    }
}
0 голосов
/ 30 июня 2010

Попробуйте добавить обработчик события для события Application.ThreadException.

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);</p> <pre><code>void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { MessageBox.Show("ThreadException:"+e.Exception.Message); }

Таким образом, вы можете обработать исключение, необнаруженное в любом коде события, без завершения приложения, например, путем регистрации или оповещения. Разумеется, является ли приложение все еще стабильным после того, как необходимо рассмотреть такое непредвиденное исключение, то есть имеет ли смысл, чтобы приложение продолжало работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...