gpt4 book ai didi

c++ - 为什么我的异常在某些配置上被捕获而在其他配置上却没有?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:55 32 4
gpt4 key购买 nike

我有一个程序抛出异常,该异常按预期在某些配置(Suse Linux,g++ 版本 4.4.1)上捕获,但显然没有在另一个配置上捕获,这里:SunOS 5.10,g++ 版本 3.3.2。以下是我的异常类的实现:

CException.hpp:

#ifndef _CEXCEPTION_HPP
#define _CEXCEPTION_HPP

#include <string>
#include <sstream>
#include <exception>
#include <stdlib.h>
#include <iostream>

class CException : public std::exception {
public:
CException();
CException(const std::string& error_msg);
CException( const std::stringstream& error_msg );
CException( const std::ostringstream& error_msg );
virtual ~CException() throw();
const char* what() const throw();
static void myTerminate()
{
std::cout << "unhandled CException" << std::endl;
exit(1);
};
private:
std::string m_error_msg;

};

CException.cpp:

#include "CException.hpp"
#include <string>
#include <sstream>

CException::CException()
{
std::set_terminate(myTerminate);
m_error_msg = "default exception";
}

CException::CException(const std::string& error_msg)
{
std::set_terminate(myTerminate);
m_error_msg = error_msg;
}

CException::CException(const std::stringstream& error_msg)
{
std::set_terminate(myTerminate);
m_error_msg = error_msg.str();
}

CException::CException(const std::ostringstream& error_msg)
{
std::set_terminate(myTerminate);
m_error_msg = error_msg.str();
}

CException::~CException() throw()
{
}

const char* CException::what() const throw()
{
return m_error_msg.c_str();
}
#endif /* _CEXCEPTION_HPP */

不幸的是,我无法创建一个简单的程序来重现该问题,但我会尝试概述代码。异常在某个文件 Auxiliary.cpp 中的函数 foo() 中抛出:

std::ostringstream errmsg;
//...
errmsg << "Error occured.";
throw CException( errmsg );

函数foo()在主程序中使用:

#include Auxiliary.hpp
//...
int main( int argc, char** argv )
{
try {
//...
foo();
} catch ( CException e ) {
std::cout << "Caught CException" << std::endl;
std::cout << "This is the error: " << e.what( ) << std::endl;
} catch ( std::exception& e ) {
std::cout << "std exception: " << e.what( ) << std::endl;
} catch ( ... ) {
std::cout << "unknown exception: " << std::endl;
}

我可以看到异常没有被捕获,因为程序退出时打印 unhandled CExceptionmyTerminate() 定义。

我尝试了 GNU 编译器的 -fexceptions 选项但没有成功。两个系统上的编译器选项实际上是相同的。

目前我无法弄清楚问题出在哪里。任何想法表示赞赏。谢谢!

最佳答案

我发现问题是由使用 Fortran95 编译器引起的。在 Sun 机器上构建程序时,它用作链接器,在其他机器上使用 g++。我不知道问题到底是什么,但我想我也会在 Sun 机器上切换到 g++。

关于c++ - 为什么我的异常在某些配置上被捕获而在其他配置上却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5469692/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com