我有一个程序抛出了一些异常,这个异常在某些配置(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 */
不幸的是,我无法创建一个简单的程序来重现这个问题,但我会尝试概述代码。
在某个文件foo()
中的函数Auxiliary.cpp
中抛出异常:
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 CException
定义的打印myTerminate()
退出时,不会捕获异常。
我已经尝试了GNU编译器的-fexceptions
选项而没有成功。两个系统上的编译器选项实际上是相同的。
目前我无法弄清问题是什么。任何想法都表示赞赏。谢谢!
答案 0 :(得分:1)
我发现问题是由使用Fortran95编译器引起的。它在Sun机器上构建程序时用作链接器,在其他机器上使用g ++。我不知道究竟是什么问题,但我想我也会在Sun机器上切换到g ++。