Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блок try catch 
V
    Опции темы
Dmi3ev
Дата 21.10.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Объясните пожалуйста принцип действия try catch на этом примере, похоже я его не понимаю  smile 
Код

if (RichEdit2->Text!="")
 {
  for (int i=0; i<RichEdit2->Lines->Count; i++)
  {
   try
    {
     new TIdAttachment(IdMessage1->MessageParts, RichEdit2->Lines->Strings[i]);
    }
   catch (...)
    {
     ShowMessage("No"+RichEdit2->Lines->Strings[i]);
    }
  }
 }

непонятно следующее, я специально пишу в RichEdit имя файла, которого нет, соответственно в строке 7 возникает исключение, но оно не перехватывается блоком catch, выдает стандартное сообщение, а мое сообщение нет, разве три точки не перехватывают любые исключения???



--------------------

PM MAIL   Вверх
korian
Дата 21.10.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



не знаю что такое TIdAttachment
может исключение посылается в отдельном потоке?


Это сообщение отредактировал(а) korian - 21.10.2008, 22:40
PM   Вверх
Lazin
Дата 21.10.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



исключения VCL они не перехватывают
Код

   catch (Exception* e)
    {
     ShowMessage("No"+RichEdit2->Lines->Strings[i]);
    }

по моему, нужно так...

Добавлено через 1 минуту и 9 секунд
давно не пользовался билдером, но насколько я помню, исключения С++ и исключения VCL (наследники Exception) он перехватывает отдельно

Добавлено через 1 минуту и 49 секунд
возможно там TException, справки под рукой нет...
PM MAIL Skype GTalk   Вверх
korian
Дата 21.10.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Lazin @  21.10.2008,  21:40 Найти цитируемый пост)
исключения VCL они не перехватывают

ну не знаю, покрайней мере так работает:
Код

    try
    {
        throw Exception("An error has occurred");
    }
    catch(...)
    {
        MessageBox(NULL, "catch", "", MB_OK);
    }
    try
    {
        throw new Exception("An error has occurred");
    }
    catch(...)
    {
        MessageBox(NULL, "catch", "", MB_OK);
    }

единственное, под дебагом, перед тем как перейти в catch, выдает сообщение о том что было исключение.
PM   Вверх
Dmi3ev
Дата 21.10.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Lazin, не подходит, а как можно узнать какое исключение возникает? т.е., что писать в скобках у catch?

Добавлено через 2 минуты и 56 секунд
korian, я делал так множество раз, все было отлично, но вот в этот раз столкнулся с тем что исключение перехватываю не я.


--------------------

PM MAIL   Вверх
Dmi3ev
Дата 21.10.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



даже конкретнее вопрос, увидел, что при появлении сообщения, он выдает class EFOpenError, я пишу:
Код

catch (EFOpenError&)
{
//...;
}


Добавлено через 1 минуту и 9 секунд
Ничего не меняется, что такое, не пойму. Раньше с таким не сталкивался.


--------------------

PM MAIL   Вверх
Headcrab
Дата 22.10.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.10.2008

Репутация: нет
Всего: нет



catch(...) перехватит любое исключение неважно какого класса. Я сомневаюсь что EFOpenError у вас возникает именно в строке
Код

new TIdAttachment(IdMessage1->MessageParts, RichEdit2->Lines->Strings[i]);

т.к. там вызывася уонструктор предка (никак не связанный с именм файла) и без всяких проверок присваивается FileName. Скорее всего исключение кидается внутри чтототам->Send(), вот его и нужно окружить try-catch.
PM MAIL   Вверх
mrbrooks
Дата 22.10.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Dmi3ev,  выложи весь код - что то не похоже что исключение срабатывает в представленном коде. возможно косяк с настройкой компонета.
PM MAIL   Вверх
Dmi3ev
Дата 22.10.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Headcrab, а вот это очень может быть, не обращал внимания, в какой строке ошибка, попробую, отпишусь вечером и выложу код по просьбе mrbrooksа. 


--------------------

PM MAIL   Вверх
Dmi3ev
Дата 22.10.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Вот весь код, нашел, где у меня там Send, действительно логично его указать в блоке (по совету Headcrabа) написал вот так:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdMessage1->Body->Text=RichEdit1->Text;
IdMessage1->From->Text=Edit1->Text+"@"+Form2->ComboBox1->Text;
IdMessage1->Recipients->EMailAddresses=Edit2->Text;
IdMessage1->Subject=Edit3->Text;
if (RichEdit2->Text!="")
 {
  for (int i=0; i<RichEdit2->Lines->Count; i++)
  {
   try
    {
     new TIdAttachment(IdMessage1->MessageParts, RichEdit2->Lines->Strings[i]);
     IdSMTP1->Send(IdMessage1);
    }
   catch (...)
    {
     ShowMessage("No"+RichEdit1->Lines->Strings[i]);
    }
  }
 }
IdSMTP1->Disconnect();
ShowMessage("sENT!");
}
 
но ничего не изменилось, в скобках у catch указывал и EFOpenError&, тот же рузультат, исключение обрабатывается не мной, почему???


--------------------

PM MAIL   Вверх
mrbrooks
Дата 23.10.2008, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Dmi3ev, у тебя исключение срабатывает при запуске из среды или когда ты экзешник запускаешь отдельно?
PM MAIL   Вверх
Dmi3ev
Дата 23.10.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



из среды, а что экзешник по другому работает? хотя помню с бд парадоксом была такая штука, что при запуске из среды не фурычило, а экзешник работал идеально, но мне казалось, что глюк парадокса, а не билдера. Запускать экзешник чтоли? 


--------------------

PM MAIL   Вверх
mrbrooks
Дата 23.10.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Dmi3ev @  23.10.2008,  11:03 Найти цитируемый пост)
из среды, а что экзешник по другому работает? 

а ты проверь  smile 

Дело все в том что при работе из среды Борман первым обрабатывает исключение и генерит свое предупреждение smile 
Поэтому у тебя и не появлялась твоя мессага. А запустив просто ехе-шник из того-же проводника уже сработает твое исключение.

Можно отключить эту опцию в Бормане что бы он сам не генерил мессагу - но лучше не стоит. 
PM MAIL   Вверх
Vyacheslav
Дата 24.10.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(mrbrooks @  23.10.2008,  11:08 Найти цитируемый пост)
Можно отключить эту опцию в Бормане что бы он сам не генерил мессагу - но лучше не стоит. 

Да можно и не отключать. Просто нажать Ok (или что там дальше ). Запустить работу дальше и получить свое сообщение



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Dmi3ev
Дата 27.10.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



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


--------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.