Поймать все исключения в приложении C # winform - PullRequest
0 голосов
/ 27 сентября 2018

в настольном приложении winform C # Я пытаюсь поймать все возможные исключения в коде, что я пробовал:

  using System;
    using System.Threading;
    using System.Windows.Forms;

    namespace Controller
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

                Application.Run(new Form1());
            }

            static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
            {
                MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
            }

            static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");           
            }
        }
    }

Я проверяю это с присоединением «COM6» с закрытием формысобытие без последовательного порта в диспетчере устройств, но я вижу только отчет Visual Studio An exception of type 'System.InvalidOperationException' occurred in System.dll but was not handled in user code

Как можно собрать данные об ошибках для приложения winform

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Вы можете использовать try-catch для перехвата исключений во всех методах.Внутри catch вы можете записать причину исключения.

try
{
   // Your code that might throw an error
}
catch( Exception e )
{
   // What you want to do when the error is thrown
   Logger.WriteException(e);
}

Я бы предпочел написать статический класс 'Logger' и метод WriteException для записи исключений в текстовый файл.

public static class Logger
{
    public static void WriteException(Exception exception)
    {
        string filePath = @"D:\Error.txt";

        using (StreamWriter logWriter = new StreamWriter(filePath, true))
        {
            logWriter.WriteLine("Message :" + exception.Message + "<br/>" + Environment.NewLine + "StackTrace :" + exception.StackTrace +
               "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
            logWriter.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
        }
    }
}

Существует несколько методов регистрации ошибок, вы можете использовать подходящий для вашего приложения.Вы можете использовать EventLog, Microsoft Logger и т. Д.

0 голосов
/ 27 сентября 2018

Это на самом деле не так сложно сделать.
Я бы посоветовал поместить любой код для обработки исключения в основную форму, чтобы сохранить program.cs как можно более чистым.

Первый в вашем Program.cs поместите это

static class Program
{
    public static Form MainForm = null;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.ThreadException += Application_ThreadException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

        MainForm = new Form1();
        Application.Run(MainForm);
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        ((Form1)MainForm).Application_ThreadException(sender, e);
    }
}

Затем в вашей основной форме поместите это

    public void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        // All unhandled exceptions will end up here, so do what you need here

        // log the error
        // show the error
        // shut the application down if needed
        // ROLLBACK database changes 
        // and so on...
    }
0 голосов
/ 27 сентября 2018

ловить все ошибки в одной точке в вашем приложении - не лучшая практика.Я предлагаю вам определить, где может произойти сбой вашего кода, и использовать блок try / catch, чтобы вместо этого перехватить определенные группы ошибок.Таким образом, вы можете лучше контролировать свое приложение и лучше определять слабые места вашего кода.Например:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

    try{
      //Put here your code
    }
    catch{
    }
}

Обобщенное «Исключение» наверняка не поможет вам или пользователю выявить возможную ошибку в приложении

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