我在linux上使用gcc来编译C ++代码。 有些例外情况不应该处理,应该关闭程序。 但是,我希望能够显示异常字符串:
例如:
throw std::runtime_error(" message");
不显示消息,仅显示错误类型。
我也想显示消息。
有办法吗?
它是一个库,我真的不想把catch语句和库用户决定。 但是,现在库用户是fortran,它不允许处理异常。 原则上,我可以将处理程序放在包装器代码中,而不是如果有一种解决方法
答案 0 :(得分:18)
标准异常有一个虚拟what()
方法,可以为您提供与异常相关的消息:
int main() {
try {
// your stuff
}
catch( const std::exception & ex ) {
cerr << ex.what() << endl;
}
}
答案 1 :(得分:6)
你可以用main写一下:
try{
}catch(const std::exception &e){
std::cerr << e.what() << std::endl;
throw;
}
答案 2 :(得分:2)
您可以使用try/catch
块和throw;
语句让库用户处理异常。 throw;
语句将控制权传递给另一个处理程序以获取相同的异常。
答案 3 :(得分:1)
我建议为你的图书馆为fortran来电者制作一个适配器。将try / catch放入适配器中。基本上你的库需要多个入口点,如果你想从fortran(或C)调用它,但仍然允许异常来提升C ++调用者。这种方式还具有为C ++调用者提供C ++链接的优点。只有拥有fortran接口才会限制你所有必须通过引用传递的东西,你需要考虑char *参数等的隐藏参数。
答案 4 :(得分:1)
GCC至少从6.2.0开始显示该消息
我已经在g ++ 6.2.0,Ubuntu 16.10上进行了测试,现在又在g ++ 9.3.0 Ubuntu 20.04中进行了测试,并且都显示了此消息,不确定行为何时更改:
#include <stdexcept>
void myfunc() {
throw std::runtime_error("my message");
}
int main() {
myfunc();
}
编译并运行:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
包含my message
错误消息的输出:
terminate called after throwing an instance of 'std::runtime_error'
what(): my message