странные проблемы с исключениями C ++ с mingw - PullRequest
6 голосов
/ 14 октября 2011

Я столкнулся со странными проблемами с исключениями при использовании mingw и смог сократить его до следующего примера:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

void test(int a) {
    if (a < 0) {
        throw std::ios_base::failure("a < 0");
    }
}
void test_file(std::string const & fName)
{
    std::ifstream inF(fName.c_str(), std::fstream::in);
    if (!inF) {
        cout << "file error -> throwing exception" << endl;
        throw ios_base::failure("could not open input file '" + fName + "'");
    }
}

int main()
{
    try { test(-5); }
    catch(std::exception& e) {
        cerr << "Exception caught: " << e.what() << " .. continue anyway" <<endl;
    }

    try { test_file("file-that-does-not-exist"); }
    catch(std::exception& e) {
        cerr << "Exception caught: " << e.what() << endl;
        exit(EXIT_FAILURE);
    }
    return EXIT_SUCCESS;
}

Первое исключение поймано, а второе нет, поэтому я получаю красивое окно с ошибкой Windows, сообщающее, что мое приложение перестало работать :-( Полный вывод командной строки:

Исключение: a <0 .. все равно продолжить <br> Ошибка файла -> исключение

Это приложение запросило среду выполнения прекратить его в Необычный способ. Пожалуйста, свяжитесь со службой поддержки приложения для более информация.

То же самое происходит и с другими исключениями (например, std :: runtime_error).

Я что-то не так делаю или проблема в другом месте?

Информация о системе: Windows 7 x64, последняя версия mingw32 (переустановлена ​​вчера с помощью mingw-get с mingw.org).

Заранее большое спасибо.
Михал

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

FWIW, на XP SP3 с MingW:

Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.4.0/configure --prefix=/mingw --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-registry --disable-werror --enable-threads --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --enable-libgomp --enable-version-specific-runtime-libs --enable-sjlj-exceptions --with-pkgversion='TDM-1 mingw32' --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php
Thread model: win32
gcc version 4.4.0 (TDM-1 mingw32)

Результаты в a.exe:

    ntdll.dll => /cygdrive/c/WINDOWS/system32/ntdll.dll (0x7c900000)
    kernel32.dll => /cygdrive/c/WINDOWS/system32/kernel32.dll (0x7c800000)
    msvcrt.dll => /cygdrive/c/WINDOWS/system32/msvcrt.dll (0x77c10000)

Вывод

Exception caught: a < 0 .. continue anyway
file error -> throwing exception
Exception caught: could not open input file 'file-that-does-not-exist'

Так что это мягкое доказательствоуказывая в направлении

  • несовместимости библиотек
  • экологических различий
  • ошибка (?) в вашей версии MingW
1 голос
/ 14 октября 2011

Нет, я не думаю, что вы делаете что-то не так, это довольно стандартно и хорошо работает под Linux.

Я бы предложил поднять запрос с людьми из MinGW. Даже если это не ошибка, они должны быть в состоянии сказать вам, что происходит.

0 голосов
/ 11 октября 2017

У меня также есть проблема с этим (6 лет спустя), за исключением того, что мой обнаружен с MSYS2, cmake / ninja / mingw32 на windows 7:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(FailedExceptions )
add_executable(FailedExceptions  main.cpp foo.c)

Вывод:

$ cmake .. -GNinja
-- The C compiler identification is GNU 7.2.0
-- The CXX compiler identification is GNU 7.2.0
-- Check for working C compiler: C:/msys64/mingw32/bin/cc.exe -- works
-- Check for working CXX compiler: C:/msys64/mingw32/bin/c++.exe -- works
-- Configuring done
-- Generating done
-- Build files have been written to: C:/msys64/home/sferguson/src/vis/build

$ ninja -v
[1/3] C:\msys64\mingw32\bin\cc.exe    -MD -MT CMakeFiles/FailedExceptions.dir/PortDescription.c.obj -MF CMakeFiles\FailedExceptions.dir\PortDescription.c.obj.d -o CMakeFiles/FailedExceptions.dir/PortDescription.c.obj   -c ../PortDescription.c
[2/3] C:\msys64\mingw32\bin\c++.exe     -MD -MT CMakeFiles/FailedExceptions.dir/main.cpp.obj -MF CMakeFiles\FailedExceptions.dir\main.cpp.obj.d -o CMakeFiles/FailedExceptions.dir/main.cpp.obj -c ../main.cpp
[3/3] cmd.exe /C "cd . && C:\msys64\mingw32\bin\c++.exe    CMakeFiles/FailedExceptions.dir/main.cpp.obj CMakeFiles/FailedExceptions.dir/PortDescription.c.obj  -o FailedExceptions.exe -Wl,--major-image-version,0,--minor-image-version,0  -lgcc_eh -lgcc_eh -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."

$ ./FailedExceptions.exe
Exception caught: a < 0: iostream error
file error -> throwing exception

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Единственный улов в том, что мне также нужно связать некоторый (любой) файл c, даже если я не использую ничего, что он предоставляет.В этом случае я сделал это с foo.c:

int foo() { return 0; }
...