6

我在使用 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 .. 仍然继续
文件错误 -> 抛出异常

此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。

其他异常(如 std::runtime_error)也会发生同样的情况。

我做错了什么,还是其他地方的问题?

系统信息:Windows 7 x64,最新的 mingw32(昨天使用 mingw.org 的 mingw-get 重新安装)。

提前非常感谢。
迈克尔

4

3 回答 3

2

FWIW,在带有 MingW 的 XP SP3 上:

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 版本中的错误(?)
于 2011-10-14T09:32:33.480 回答
1

不,我不认为你在那里做错了什么,这是非常标准的,并且在 Linux 下运行良好。

我建议向 MinGW 人提出疑问。即使它不是错误,他们也应该能够告诉你发生了什么。

于 2011-10-14T09:30:09.043 回答
0

我也有这个问题(6年后),除了我在Windows 7上使用MSYS2、cmake/ninja/mingw32找到我的:

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; }
于 2017-10-11T13:10:33.663 回答