Исключения через границу модуля
От: sc Россия  
Дата: 14.08.09 09:00
Оценка:
Бросаем исключение в одном модуле, перехватываем в другом. В другом модуле с исключением ничего не делаем. Могут ли быть в таком случае проблемы? Вроде бы проблем быть не должно.
    // в одном модуле
    void f()
    {
        try
        {
            //... Где-то тут выбросилось искл.
        }
        catch (MyException const& e)
        {
            //... Перехватили, обработали и перебросили дальше
            throw;
        }
    }
    
    // в другом модуле
    try
    {
        // вызываем ф-цию из первого модуля
        f();
    }
    catch (MyException const&)
    {
        // перехватываем исключение из первого модуля
        state = eNoCalc;
    }
Re: Исключения через границу модуля
От: Xeor Россия  
Дата: 14.08.09 09:54
Оценка:
Здравствуйте, sc, Вы писали:

sc>Бросаем исключение в одном модуле, перехватываем в другом. В другом модуле с исключением ничего не делаем. Могут ли быть в таком случае проблемы? Вроде бы проблем быть не должно.


Зависит от особенностей ABI. В некоторых случаях могут быть несогласованности, например можно только поймать MyException как std::exception (если от него унаследовано), или даже как catch (...) — это если несогласованы typeinfo. На каких-то платформах ABI наверное может вообще не поддерживать передачу между модулями.

Но в большинстве случаев все в порядке.
Re: Исключения через границу модуля
От: Аноним  
Дата: 14.08.09 10:38
Оценка:
sc>Бросаем исключение в одном модуле, перехватываем в другом. В другом модуле с исключением ничего не делаем. Могут ли быть в таком случае проблемы? Вроде бы проблем быть не должно.
проблемы будут ровно теже как с выделением освобождением памяти между разными модулями + специфика реализации механизма исключений.
То есть в винде, при использовании модулей скомпиленными одной и той же студией использующих динамический рантайм и с одними и теми же настройками компилятора и без использования каких либо дополнительных библиотек замещающих стандартные классы и механизмы выделения памяти проблем скорее всего не будет.
Re: Исключения через границу модуля
От: Юрий Жмеренецкий ICQ 380412032
Дата: 14.08.09 14:00
Оценка: 1 (1)
Здравствуйте, sc, Вы писали:

sc>Бросаем исключение в одном модуле, перехватываем в другом. В другом модуле с исключением ничего не делаем. Могут ли быть в таком случае проблемы? Вроде бы проблем быть не должно.


Никаких гарантий нет...
Но если окажется, что сама по себе передача исключения через границы происходт безболезненно и используются динамически загружаемые модули, то могут быть проблемы такого характера:

//...
int real_main()
{
  module m = load_module(...);

  // Вызов приводит к выбросу исключения, которое определено в самом модуле 
  // и вызывающий о нем ничего не знает.
  m->func(); 

  //...

  // В деструкторе module::~module произойдет выгрузка модуля.
}

int main() {
  try {
    return real_main();
  }
  catch(const exception& ex) {
    const char* p = ex.what(); // oops! реализация exception::what (в наследнике) была выгружена вместе с модулем.
    //...
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.