Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
1

Можно ли не прерывать программу при исключении

23.01.2014, 16:44. Просмотров 1631. Ответов 11
Метки нет (Все метки)

Хочу построить уведомления об ошибках пользовательского ввода на исключениях, но уведомлять об ошибках по очереди как-то некрасиво, хочется взять все ошибки сразу и вывести их красивым списком в окошке.

Но проблема в том, что после возникновения исключения, код, что идет далее не выполняется.
То есть:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<Exception> myList = new List<Exception>(); // Список для исключений
try
{
throw new Exception("Сообщение 1");
throw new Exception("Сообщение 2"); // Этот код уже не выполнится
}
catch(Exception exc)
{
myList.Add(exc); // Пихаем в список
}
finally
{
SomeForm.Show(myList); // После всего, некая форма выведет на экран сообщения об исключениях
}
Код сильно упрощен.

Как реализовать то что я хочу? То есть собрать все возникшие исключения в один список и вывести их сообщения позже.
Пока кроме как писать блок трай-кэч для каждого исключения ничего в голову не приходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 16:44
Ответы с готовыми решениями:

Многопоточность проигрывателя - при новом воспроизведении не прерывать старое
Как одновременно воспроизвести 2 и более звука, я создал 3 кнопки и каждая из...

Как при завершении главного потока прерывать фоновые потоки?
При завершении главного потока фоновые прерываются. Как сделать?

продолжить работу, при не обрабатываемом исключении
Моё приложение использует объект сборки к исходникам которой доступа нет....

Ошибка в исключении
Здраствуйте, посмотрите код, там, где исключение ошибка.Я его туда вставил...

Перехват исключения в исключении
Есть код, при перехвате исключения - исполняется некий код. Но что делать, если...

11
KeBJIaP
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
23.01.2014, 16:53 2
Ну куонечно, после выброса первого исключения тебя выкидывает в блок catch

Добавлено через 1 минуту
Либо обрабатывать каждое исключение отдельным блоком try-catch либо вообще забить на исключения(пользовательские) и сделать лист строк, в который добавлять строки с текстом ошибки.
0
valera_21
369 / 354 / 93
Регистрация: 05.01.2010
Сообщений: 1,469
Завершенные тесты: 5
23.01.2014, 16:54 3
имхо
Цитата Сообщение от KeBJIaP Посмотреть сообщение
обрабатывать каждое исключение отдельным блоком try-catch
1
KeBJIaP
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
23.01.2014, 16:54 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<string> myList = new List<string>(); // Список для исключений
try
{
myList.Add("Сообщение 1");
myList.Add("Сообщение 2");
throw new Exception("");
}
catch(Exception exc)
{
 
}
finally
{
SomeForm.Show(myList); // После всего, некая форма выведет на экран сообщения об исключениях
}
0
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
23.01.2014, 17:17  [ТС] 5
Видимо без нагромождения кода не получится сделать(((
Всем спасибо.
0
pycture
1173 / 561 / 85
Регистрация: 20.09.2012
Сообщений: 1,818
Завершенные тесты: 3
23.01.2014, 19:29 6
Цитата Сообщение от Void-87 Посмотреть сообщение
То есть собрать все возникшие исключения в один список и вывести их сообщения позже.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace A
{
    class Program
    {
        static void safe(List<string> log, Action fn)
        {
            try { fn(); } catch (Exception exc) { log.Add(exc.Message); }
        }
 
        static void Main()
        {
            List<string> log = new List<string>(); 
            int i = 1, y = 10;
            safe(log, () => { 
                Console.WriteLine("Result = {0}", i += y); 
                throw new Exception("Сообщение 1"); 
            });
            safe(log, () => { 
                Console.WriteLine("Result = {0}", i += y);
                throw new Exception("Сообщение 2"); 
            });
            safe(log, () => { 
                Console.WriteLine("Result = {0}", i += y); 
                throw new Exception("Сообщение 3"); 
            });
 
            Console.WriteLine("------- Errors");
            foreach (var item in log)
                Console.WriteLine(item);
            Console.ReadKey();
        }
 
    }
}
1
tezaurismosis
Администратор
Эксперт .NET
8583 / 3872 / 730
Регистрация: 17.04.2012
Сообщений: 8,622
Записей в блоге: 14
23.01.2014, 20:22 7
Как я пониманию, приложение для Windows Forms.
Можно организовать глобальную обработку ошибок для приложения, обработав AppDomain.CurrentDomain.UnhandledException:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Example 
{
   [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
   public static void Main()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
 
      try {
         throw new Exception("1");
      } catch (Exception e) {
         Console.WriteLine("Catch clause caught : {0} \n", e.Message);
      }
 
      throw new Exception("2");
   }
 
   static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
   {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
      // Здесь нужно выставить args.IsTerminating в false, что бы CLR не прервала работу
   }
}
Подробнее:
AppDomain.UnhandledException
UnhandledExceptionEventArgs.IsTerminating
0
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
24.01.2014, 19:55  [ТС] 8
pycture
Не совсем понял задумку. Сделать метод, который будет изымать исключения? Так его так же придется запускать каждый раз для каждой функции, что только усложняет код.

tezaurismosis
Спасибо, но глобально тут не подойдет, но зато теперь я знаю что так можно)))
0
Psilon
Master of Orion
Эксперт .NET
6009 / 4859 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
24.01.2014, 20:03 9
Void-87, это вам не интерпретатор, который может проглотить строку с ошибкой, ругнуться в лог, и продолжить выполнение как нефиг делать. Простейший способ - обернуть все места, где могут выбрасываться исключения, в методы, возвращающие булевский флаг, было исключение или нет(см. msdn на примере int.TryParse)
2
pycture
1173 / 561 / 85
Регистрация: 20.09.2012
Сообщений: 1,818
Завершенные тесты: 3
24.01.2014, 20:57 10
Цитата Сообщение от Void-87 Посмотреть сообщение
Так его так же придется запускать каждый раз для каждой функции, что только усложняет код.
Ну не для каждой функции, а для логического блока, который может свалиться. Во вторых писанины все таки меньше чем с try-catch. A еще если ввести еще 1 функцию типа unsafe, которая не будет перехватывать исключения, то можно будет легко отключать перехват исключений для блоков, заменой safe => unsafe, что тоже может пригодиться в разных случаях. В случае try-catch придется комментить, да еще и в двух местах, что как минимум неприятно. А можно ввести функцию rem, которая вообще ничего делать не будет, и заменой safe => rem можно будет отключать целый блок из исполнения (всемто того чтоб его комментить). Ну и т.д.
0
Void-87
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
24.01.2014, 22:21  [ТС] 11
Цитата Сообщение от Psilon Посмотреть сообщение
Void-87, это вам не интерпретатор, который может проглотить строку с ошибкой, ругнуться в лог, и продолжить выполнение как нефиг делать. Простейший способ - обернуть все места, где могут выбрасываться исключения, в методы, возвращающие булевский флаг, было исключение или нет(см. msdn на примере int.TryParse)
Я и пытался сделать аналогичным образом сначала. Метод, который проверял валидность полей, возвращал булл, метод запускался в блоке кэч. Но проблема в том, что валидность могла быть нарушена сразу в нескольких полях, но исключение бы кинулось только на первую ошибку и, соответственно, я уже бы не смог собрать их все.
Расскажите подробнее что вы имеете ввиду?

Добавлено через 1 минуту
Цитата Сообщение от pycture Посмотреть сообщение
Ну не для каждой функции, а для логического блока, который может свалиться.
Как именно? Можете привести простейший пример?
0
Psilon
Master of Orion
Эксперт .NET
6009 / 4859 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
24.01.2014, 22:22 12
Void-87, если вам валидацию кучи полей сделать, то возможно(!!) вам лучше сделать это с помощью WPF, там валидация полей происходит автоматически. Правда вам придется изучить кучу лит-ры по самому WPF, для решения этой задачи - страниц 200-300 какого-нибудь учебника типа Макдональда, но в этом есть определенный смысл, знания-то при вас останутся, а некоторые задачи на WPF не в пример проще делать.
0
24.01.2014, 22:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 22:22

Можно ли с помощью JavaScript перехватывать событие обновления окна и прерывать его?
Уважаемые господа. У меня есть такой вопрос - можно ли с помощью JavaScript...

При нахождении записи не прерывать поиск
Снова здравствуйте, задача старая, код с поправками. При поиске прога ищет...

Выводить сообщение при исключении
Здравствуйте, написал код, т.с. методом научного тыка, ну не понимаю я java ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru