LINUX.ORG.RU

C++ и exceptions handling


0

0

Привет.

При:

void A()

{

if(a > b)

throw MyException s("Exception!")

..... }

Прога получае SIGABRT сразу после отработки конструктора MyException. Как сделать так, чтоб этого не происходило?

Спасибо.

anonymous

класс бросаемого исключения сам не должен бросать исключений. С этим все в порядке?..

dilmah ★★★★★
()
Ответ на: комментарий от fura13

Это понятно, но само по себе странно. По идее - не должно такого происходить.

anonymous
()
Ответ на: комментарий от anonymous

> Да, MyException никаких исключений не бросает.

просто вспомнился классический пример -- класс исключения содержит внутри себя std::string, который может бросить исключение, например, при нехватке памяти.

dilmah ★★★★★
()

Покажи весь код. Приведенный выше пример не должен был даже откомпилироваться: правильно писать throw MyException("Exception!"); А вообще abort возникает либо при неотловленном исключении либо когда функция выбрасывает исключение не того типа которое было объявлено для нее в throw().

asso_w
()

Попробуй или так:
----------------------------------------------------------
void A(){
  try
  {
    if(a > b) throw MyException s("Exception!"); 
  }
  catch( MyException& e )
  {
     // здесь выводишь сообщение - MyException
  }
  catch( ... )
  {
     // сообщение - неизв. exceptions
  }
};

или так:
-----------------------------------------------------------
void A() {
  if(a > b) throw MyException s("Exception!"); 
};

...
...
//гдето в проге
try
{
  A();
}
catch( MyException& e )
{
// здесь выводишь сообщение - MyException
}
catch( ... )
{
// сообщение - неизв. exceptions
}

...
...

PETER ★★
()
Ответ на: комментарий от PETER

Спасибо всем - получилось :)

Блинн, я делал throw new MyException("Exc");

Надо ж без new.

Хотя вопрос: а почему с new абортит?

Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

>Хотя вопрос: а почему с new абортит?

Может просто потому что никто исключение в этом случае не ловит?

Поскольку если бросать throw new MyException(""), то ловить нужно catch(MyException *ex).

WFrag ★★★★
()
Ответ на: комментарий от anonymous

с new перехват должен быть таким:

catch( const MyException * e )
{
  // здесь сообщение об ошибке
  ....
  delete e;
}

PETER ★★
()

Тут по ходу еще один вопрос:

скажем, в main:

MyObject *mobj;

try

{

mobj = new MyObject();

}

catch(ObjFailedException &ex)

{

...

}

Теперь представим, что выбрасывается исключение (бросаю-то я его в конструкторе класса MyObject).

Вопрос:

А ведь в этом случае мы имеем memory leak, т.к. не можем использовать delete ибо объект не создан.

Вариант с созданием объекта в stack memory - не предлагать, не подходит.

Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

Есть operator new который просто выделяет память. А есть выражение new, которое ты использовал. Выражение new это слитые воедино operator new и конструктор. Если конструктор бросает исключение то C++ runtime machinery должна обеспечить освобождение памяти.

If any part of the object initialization described above terminates by throwing an exception and the new-expression does not contain a new-placement, then the deallocation function (_basic.stc.dynamic.deallocation_, _class.free_) is called to free the memory in which the object was being constructed, after which the exception continues to propagate in the context of the new-expression.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Спасибо. Я, собственно, ?то и предполагал. Просто посмотрел на вывод valgrind'a, а он пишет memory leak.

Еще раз всем спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.