Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2013, 13:46   #1
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию Исключение внутри потока

День добрый, не понятная ситуация с потоками, если внутри потока возникает исключение то программа просто падает, т.е. не появляется окно с ошибкой, а винда просто предлагает зарыть или перезапустить приложение. Когда исключение возникает в процессе отладки, жму F5 опять это же исключение, еще жму, опять это же, и так можно жать хоть целый день. Может есть какая-то особенность при работе с исключениями в потоках.

P.S.
Поток создается один
fate вне форума Ответить с цитированием
Старый 20.10.2013, 14:17   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Есть особенность при работе с исключениями вообще: необработанное исключение (Unhandled exception) приводит к аварийному завершению программы (" винда просто предлагает зарыть или перезапустить приложение").
Во избежание оного оборачивайте места, в которых возможно возникновение исключения в блоки try { ... } catch { } (http://msdn.microsoft.com/ru-ru/library/dszsf989.aspx)

Во время отладки само исключение перехватывает Exception Assistant (или как там его), встроенный в Visual Studio, не полагайтесь на него

А отдельный поток тут в целом не при чем
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 20.10.2013, 14:24   #3
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

так дело в том что все это в блоке try catch происходит, если я в catch передаю исключение процедуре "выше" throw .... то такая фигня и получается, конечно если я буду выводить текст ошибки через MessageBox.Show и после прерывать поток то все норм.
Цитата:
А отдельный поток тут в целом не при чем
а почему ж тогда такое поведение программы только в потоке, в других программах в которых нет доп. потоков исключение работает нормально
fate вне форума Ответить с цитированием
Старый 20.10.2013, 14:37   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Я не видел ваших остальных программ, поэтому не могу прокомментировать их поведение.

Стандартная реакция CLR на исключения выглядит так:
Цитата:
Если в текущем методе согласований не найдено, среда выполнения проводит поиск каждого вызывающего оператора текущего метода и продолжает этот процесс, перемещаясь вверх по стеку. Если не найден ни один соответствующий, то среда выполнения предоставляет отладчику доступ к исключению. Если отладчик не подключается к исключению, среда выполнения создает событие AppDomain.UnhandledException событие. Если нет слушателей для события, среда выполнения делает дамп трассировки стека и завершает приложение.
Пруф: http://msdn.microsoft.com/ru-ru/library/5b2yeyab.aspx
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 20.10.2013, 14:58   #5
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
Если в текущем методе согласований не найдено
что значит согласований?
у меня так:
в таймере происходит создание потока, поток выполняет определенную процедуру.
создание потока обернуто в блок try catch
Код:
private void timer1_Tick(object sender, EventArgs e)
{
   try
    {
        thread = new Thread(Start);
        thread.Start();
    } catch (Exception exc) {
        timer1.Enabled = false;
        MessageBox.Show(string.Format("Произошла ошибка: \"{0}\"", exc.Message));
     }
}
И если внутри процедуру Start происходит исключение, до catch (тот что в примере) дело не доходит
fate вне форума Ответить с цитированием
Старый 20.10.2013, 15:11   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Верно, поскольку метод "timer1_Tick" уже закончится к тому моменту, когда в методе Start() возникнет исключение.
Чтобы отловить исключение, блок try-catch следует поместить в сам метод Start()

Так у вас сейчас:
Код:
private void Start()
{
  // Какой-то код
}
Должно быть:
Код:
private void Start()
{
  try
  {
    // Какой-то код
  }
  catch(Exception exc)
  {
    timer1.Enabled = false;
    MessageBox.Show(string.Format("Произошла ошибка: \"{0}\"", exc.Message));
  }
}

Цитата:
что значит согласований?
машинный перевод на msdn фееричен) согласование == подходящий оператор try-catch
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 20.10.2013 в 15:13.
Luuzuk вне форума Ответить с цитированием
Старый 20.10.2013, 15:15   #7
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
поскольку метод "timer1_Tick" уже закончится к тому моменту, когда в методе Start()
вот ё моё, не подумал, спасибо
fate вне форума Ответить с цитированием
Старый 20.10.2013, 16:05   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
поскольку метод "timer1_Tick" уже закончится к тому моменту, когда в методе Start()
Ну это вообще говоря не так. Исключение не было бы отловлено, даже если бы оно возникло в Start во время работы Tick, так как поиск обработчиков исключений производится в том потоке, в котором оно было выброшено (а тут оно выбрасывается не в потоке, в котором работает таймер).
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 20.10.2013, 16:16   #9
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Ну это вообще говоря не так.
Ну на самом-то деле это вообще не определено, исключение может успеть возникнуть, а может и не успеть, многопоточность-с

Цитата:
не было бы отловлено, даже если бы оно возникло в Start во время работы Tick
Верно но считаю свое упрощение оправданным: просто грузить ТС кучей информации не стал

p.s. с механизмами генерации и обработки исключений ознакомлен
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 20.10.2013, 19:55   #10
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Luzzuk, в вас у меня не было сомнений, я это как раз для ТС написал: мало ли, пригодится)
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Explorer.exe Исключение неизвестное программное исключение Windows XP, что делать? Igorilla Windows 6 02.04.2013 22:49
Исключение неизвестное программное исключение... Host-2013 Паскаль, Turbo Pascal, PascalABC.NET 19 09.02.2013 21:30
Исключение при работе потока Berlioz Помощь студентам 2 07.01.2013 08:51
Исключение при дессериализации "обнаружен конец потока до завершения разбора" 6salo6 C# (си шарп) 3 06.02.2012 19:38
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26