прекращение вызова после создания экземпляра 'std :: string' - PullRequest
1 голос
/ 02 июля 2011

У меня есть этот двоичный файл, который падает, выбрасывая исключение типа std: string.

Трассировка стека из очищенного двоичного файла:

terminate called after throwing an instance of 'std::string'
*** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date ***
PC: @       0x3fb0c30155 (unknown)
*** SIGABRT (@0xd54) received by PID 3412 (TID 0x40d03940) from PID 3412; stack trace: ***
    @       0x3fb180de70 (unknown)
    @       0x3fb0c30155 (unknown)
    @       0x3fb0c31bf0 (unknown)
    @     0x2aaaaab80cc4 (unknown)
    @     0x2aaaaab7ee36 (unknown)
    @     0x2aaaaab7ee63 (unknown)
    @     0x2aaaaab7ef4a (unknown)
    @           0x4c2622 XYZ::connect()
    @           0x4c3e0f XYZ::refresh()
    @       0x3fb18062f7 (unknown)
    @       0x3fb0cd1e3d (unknown)

Теперь дело в том, что функция refresh () пытается перехватить std :: string. Это выглядит так: -

bool XYZ::refresh() {
  try {
    connect();
  } catch (string& s) {
    return false;
  }
  return true;
}

Есть идеи, почему его не поймали? Или я неправильно читаю трассировку стека?

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Возможно, некоторые или все модули были скомпилированы с -fno-exceptions?См. http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html для получения подробной информации о том, как это меняет поведение исключений.

Например, следующая короткая программа отображает "terminate called after throwing an instance of 'std::string'", если:

  • модуль, который содержит foo() был скомпилирован с -fno-exceptions, а
  • foo() вызывает что-то, что вызывает исключение типа std::string (все остальные модули были скомпилированы с -fexceptions)

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int foo();
    
    int main()
    {
        try {
            foo();
        }
        catch (string& s) {
            std::cout << "caught it: \"" << s << "\"" << endl;
        }
    
        return 0;
    }
    

Обратите внимание: если я просто перекомпилирую foo.cpp с параметром -fexceptions (по умолчанию для g ++) и перекомпоновлю, программа отобразит:

caught it: "the string exception"

, как и ожидалось.


Или, возможно, какая-то промежуточная функция имела спецификацию броска, в которой не было указано std::string?

Например, эта программа:

#include <string>
#include <iostream>

using namespace std;

int Hunc() throw(int); // can only throw int (?)

int main()
{
    try {
        Hunc();
    }
    catch (string& s) {
        std::cout << "caught it: \"" << s << "\"" << endl;
    }

    return 0;
}


int Hunc() throw(int)
{
    throw string("the string exception");
}

Также отображает «завершение вызова» после броска экземпляра'std :: string' ".Оба примера были протестированы на Windows-коробке с MinGW 4.5.1.

0 голосов
/ 02 июля 2011

Что должно быть в порядке .

Возможно, вы не пересобрали все исходные файлы или используете устаревший исполняемый файл.

...