повысить исключения в общей библиотеке - PullRequest
2 голосов
/ 06 января 2012

РЕДАКТИРОВАТЬ: РАЗРЕШЕНО. Проблема была гораздо более мягкой - у меня было две функции, которые вызывались внутри друг друга в одной строке кода - обе использовали lexical_cast, а , другая , одна из них вызывала сбой. Интересно, что мне удалось выяснить это только путем разбрызгивания большого количества cout, поскольку не было никакого обратного следа при сбое, и когда отладка строки была строкой, gdb по какой-то причине указывал неправильный lexical_cast как виновника (а другой я не видел, вздыхаю). Спасибо за помощь!


Я использую gcc 4.1.2 и boost 1.48. У меня есть следующий код в общей библиотеке внутри функции шаблона:

try {
  boost::lexical_cast<T>(s);
}
catch (...) {
  std::cout << "Caught it" << std::endl;
  throw;
}

Приведение завершается неудачно, но исключение не перехватывается ( выполняет распространение и завершение программы, но это предложение catch не перехватывает его). T - это long, а s - это std::string, равное "234a234". (Я также попытался обернуть надстройку над бустом в #pragma GCC visibility push(default), а также попытался добавить флаг -shared-libgcc при компоновке, но ничего не получилось.)

Становится лучше, хотя. В следующих двух случаях исключение попадает в ловушку:

try {
  throw boost::bad_lexical_cast();
}
catch (...) {
  std::cout << "Caught it" << std::endl;
  throw;
}

и удивительно этот:

try {
  boost::lexical_cast<T>(s);
  throw boost::bad_lexical_cast();
}
catch (...) {
  std::cout << "Caught it" << std::endl;
  throw;
}

Есть идеи о том, что происходит и, что более важно, как это исправить?

Ответы [ 2 ]

1 голос
/ 07 января 2012

Я не могу воспроизвести на моей машине, но я использую другой компилятор

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)

В качестве теста я использовал следующее:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>
#include <exception>

using namespace std;

template<typename T>
T printLexicalCast(const std::string& s){
    T t;
    try {
         t = boost::lexical_cast<T>(s);
         cout << "cast is [" << t << "] from string [" << s << "]" << endl;
    }
    catch (const boost::bad_lexical_cast& e ) {
      std::cout << "Caught bad lexical cast with error " << e.what() << std::endl;
    }
    catch( ... ){
        std::cout << "Unknown exception caught!" << endl;
    }
    return t;
}   


int main(int argc, char *argv[]) {

    std::string badString("234a234");
    long l1 = printLexicalCast<long>(badString); //exception


    std::string goodString("123456");
    long l2 = printLexicalCast<long>(goodString); 

    return 0;
}

Я получаю следующий вывод:

Caught bad lexical cast with error bad lexical cast: source type value could not be interpreted as target
cast is [123456] from string [123456]

Если я уберу уловку bad_lexical_cast, ловушка все работает.

Unknown exception caught!
cast is [123456] from string [123456]

Может быть, это просто ошибка компилятора? Я нашел это в списке буст-пользователей

http://boost.2283326.n4.nabble.com/conversion-lexical-cast-doesn-t-throw-td2593967.html

0 голосов
/ 06 января 2012

Это произойдет, если BOOST_NO_EXCEPTIONS будет определен где-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...