Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработка исключений для всей программы


Автор: deviLoper 28.8.2007, 12:46
Есть достаточно большое приложение в котором иногда возникают ошибки  smile 
Хотелось бы написать обработчик для непредвиденных ошибок, который выдавал бы пользовтателю сообщение вместо стандартного 
"Unhandled exception has occured in your application....."
Пробывал так:
Код

[STAThread]
        static void Main()
        {
            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmMain());
            }
            catch (Exception ex)
            {
                                MessageBox.Show("В прогрмме произошла ошибка.\nИзвените за неудобства\nПрограммисту отправлен отчет об ошибке", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Но такой код работет, только если запускаю приложение из Visual Studio. Когда запускаю ехе'шник при возниконовении ошибки выдается неприятный диалог.

Автор: SpaceSpace 28.8.2007, 12:52
так не делают.
это очень плохой стиль.

исключения нужно локализовать,
т.е.  блоки try\catch должны размещаться в месте возможного исключения,
по всему тексту вашего "большого" приложения.

Автор: deviLoper 28.8.2007, 17:43
Программа достаточно большая, предусмотреть в каком событии может возникнуть ошибка достаточно трудно, прописать обработчики исключений для каждого события нереально. А уведомить программистов о возникновении  такой ошибке крайне необходимо.
В реалниой программе при обработке такого исключения программисту на и-мейл отправляется сообщение с описанием ошибки и трассировкой, что бы в последствии он мог ее исправить.
Исходя из этого практика вполне приемлимая.

P. S. А повторять одинаковый код обработчиков исключений по всей программе то же 
Цитата
очень плохой стиль
. 

Автор: Experimenter 28.8.2007, 19:07
Возможно, исключение тем не менее возникает где-то вне обработчика???

Насчет стиля согласен со СпейсСпейсом. Что это за программа, в которой ошибка может в любом месте возникнуть???

Автор: Stepan_Lameroff 28.8.2007, 20:40
Посмотрите AppDomain.UnhandledException Event и Application.ThreadException Event

Интересная статья по теме http://www.wintellect.com/cs/blogs/jclark/archive/2005/03/30/simple-main.aspx

Автор: andrx 29.8.2007, 09:21
можно примерно так (для vs2003) :
Код

public class main
    {
        main(){}
        /// <summary>Main.</summary>
        [STAThread]
        static void Main() 
        {
            Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.Run(new ФормаГлавная(_ПриложениеКоманды.ЗапускПрограммы,null));
        }
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            // вывести сообщение об ошибке
            Ошибка._Ошибка = ОшибкаПеречень.НепредусмотреннаяОшибка;

            // если лог-файл больше 100м -удалить его
            FileInfo fileLog = new FileInfo("log.txt");
            if ( fileLog.Exists ) { if ( fileLog.Length > 100000000) { fileLog.Delete(); } }
                
            StreamWriter sw = new StreamWriter("log.txt",true,System.Text.Encoding.Default);
            sw.WriteLine();
            sw.WriteLine("---[ "+ DateTime.Now.ToShortDateString() +", "+ DateTime.Now.ToLongTimeString() +" ]--------------------------------------------------------------------------------");
            sw.WriteLine(e.Exception.ToString());
            sw.Close();            
        }
    }

Автор: deviLoper 29.8.2007, 17:19
Stepan_Lameroff и andrx большое спасибо это то, что я искал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)