C++ 抛出异常后Catch Block Debug语句未执行? 问题

C++ 抛出异常后Catch Block Debug语句未执行? 问题,c++,linux,c++11,g++,C++,Linux,C++11,G++,我有一个从异常类GlHelperException派生的GLSLFailedToLadeException GlHelperException具有虚拟抛出函数,用于使用异常的title属性和带有文件名的行号描述错误 但是,当我在主函数中测试异常时,catch块没有打印正确的what()函数调试日志,并在抛出GLSLFailtedToLoadException的instance后返回terminate called 异常定义 试验场地 预期结果 您正在抛出指向对象的指针,但试图捕捉对象(通过引用)

我有一个从异常类GlHelperException派生的GLSLFailedToLadeException

GlHelperException具有虚拟抛出函数,用于使用异常的title属性和带有文件名的行号描述错误

但是,当我在主函数中测试异常时,catch块没有打印正确的what()函数调试日志,并在抛出GLSLFailtedToLoadException的instance后返回terminate called

异常定义 试验场地 预期结果
您正在抛出指向对象的指针,但试图捕捉对象(通过引用)

throw
语句更改为抛出对象:

throw GLSLFailedToLoadException(__FILE__, __LINE__);
我还建议通过
const
引用始终
catch
异常,因此:

catch (const GLSLFailedToLoadException& e)
由于当前编写的代码无法捕获异常,因此它会离开
main()
,从而导致您看到的结果-一个未捕获的异常终止程序


您还需要在异常对象中使用
std::string
s而不是指针(
const char*
),因为您当前存储的指针在对象的持续时间内不存在,因此您需要复制指向的字符串。

您正在向对象抛出指针,但试图捕获对象(通过引用)

throw
语句更改为抛出对象:

throw GLSLFailedToLoadException(__FILE__, __LINE__);
我还建议通过
const
引用始终
catch
异常,因此:

catch (const GLSLFailedToLoadException& e)
由于当前编写的代码无法捕获异常,因此它会离开
main()
,从而导致您看到的结果-一个未捕获的异常终止程序


您还需要在异常对象中使用
std::string
s,而不是指针(
const char*
),因为当前存储的指针在对象的持续时间内不活动,所以需要复制指向的字符串。

但是现在输出是异常,调试日志不是printing@SiddharthSingh:将
const char*title;
const char*filename;
更改为
std::string
。您不能只需存储这些指针。@SiddharthSingh这是一个完全不同的问题,应该是一个不同的问题。但是,您创建了一个临时
std::string
对象,该对象立即被销毁,这意味着您返回的指针立即无效。@SiddharthSingh继续讨论Jesp指出的问题er Juhl,而不是将指针作为成员存储在对象中,而是在构造函数中构造完整字符串并将其存储(作为
std::string
对象)。由于字符串存储在对象中,指针指向它(及其包含的原始字符串)将在异常对象的整个生存期内都有效。但现在输出为exception CaughtDebug日志不是printing@SiddharthSingh:将
const char*title;
const char*filename;
更改为
std::string
。您不能只存储这些指针。@Siddhartsingh这是一个完全不同的问题这应该是一个不同的问题。但是,您创建了一个临时
std::string
对象,该对象立即被销毁,这意味着您返回的指针立即无效。@SiddharthSingh要扩展Jesper Juhl指出的问题,而不是将指针作为成员存储在对象中,请构造构造函数中的完整字符串并将其存储(作为
std::string
对象)。由于字符串存储在对象中,因此指针指向它(及其包含的原始字符串)将在异常对象的整个生命周期内都有效。在
glslfailedtoladexception
构造函数中,您确实应该使用初始化列表而不是构造函数体。然后将
const char*
成员更改为
const std::string
s,以便实际复制传入的va值,而不仅仅是存储即将失效的指针。在
glslfailedtoladexception
构造函数中,您确实应该使用初始化列表而不是构造函数体。此外,还应将
const char*
成员更改为
const std::string
s,以便实际复制传递的在值中,而不仅仅是存储即将失效的指针。
throw GLSLFailedToLoadException(__FILE__, __LINE__);
catch (const GLSLFailedToLoadException& e)