Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > блок try catch


Автор: Dmi3ev 21.10.2008, 22:27
Объясните пожалуйста принцип действия 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, выдает стандартное сообщение, а мое сообщение нет, разве три точки не перехватывают любые исключения???

Автор: korian 21.10.2008, 22:39
не знаю что такое TIdAttachment
может исключение посылается в отдельном потоке?

Автор: Lazin 21.10.2008, 22:40
исключения VCL они не перехватывают
Код

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

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

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

Добавлено через 1 минуту и 49 секунд
возможно там TException, справки под рукой нет...

Автор: korian 21.10.2008, 22:53
Цитата(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, выдает сообщение о том что было исключение.

Автор: Dmi3ev 21.10.2008, 22:54
Lazin, не подходит, а как можно узнать какое исключение возникает? т.е., что писать в скобках у catch?

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

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

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


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

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

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

т.к. там вызывася уонструктор предка (никак не связанный с именм файла) и без всяких проверок присваивается FileName. Скорее всего исключение кидается внутри чтототам->Send(), вот его и нужно окружить try-catch.

Автор: mrbrooks 22.10.2008, 07:47
Dmi3ev,  выложи весь код - что то не похоже что исключение срабатывает в представленном коде. возможно косяк с настройкой компонета.

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

Автор: Dmi3ev 22.10.2008, 20:58
Вот весь код, нашел, где у меня там 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&, тот же рузультат, исключение обрабатывается не мной, почему???

Автор: mrbrooks 23.10.2008, 07:35
Dmi3ev, у тебя исключение срабатывает при запуске из среды или когда ты экзешник запускаешь отдельно?

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

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

а ты проверь  smile 

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

Можно отключить эту опцию в Бормане что бы он сам не генерил мессагу - но лучше не стоит. 

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

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

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

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