Visual studio 在Visual C+中引发自定义异常+;2019
MFC定义了抛出预定义异常的函数。例如,使用Visual studio 在Visual C+中引发自定义异常+;2019,visual-studio,exception,visual-c++,mfc,Visual Studio,Exception,Visual C++,Mfc,MFC定义了抛出预定义异常的函数。例如,使用::AfxThrowFileException()引发类型为CFileException的异常。但是,如果我定义自己的异常类,它派生自CException?你喜欢用什么方式扔 如果我只是这样做,会有问题吗: if (!m_Settings.IsValid()) throw new CMyException(_T("This operation failed.")); 在Visual Studio 2019中,上述代码生成以下Intellise
::AfxThrowFileException()
引发类型为CFileException
的异常。但是,如果我定义自己的异常类,它派生自CException
?你喜欢用什么方式扔
如果我只是这样做,会有问题吗:
if (!m_Settings.IsValid())
throw new CMyException(_T("This operation failed."));
在Visual Studio 2019中,上述代码生成以下Intellisense警告。但我还没有看到任何使用make_unique
抛出异常的示例
警告C26409避免显式调用new和delete,请改用std::make_unique(r.11)
谁能解释这个问题,或者引用我当前的文档?
< P>异常处理是其中显示的一个领域,MFC先于C++的数量相当可观。由于C++异常是C++标准的后期添加,MFC已经决定了它的异常处理策略:- 在freestore上分配异常对象
- 按指示投球
- 用指针捕捉
- 任何处理异常的
子句都需要释放与异常对象关联的资源catch
- 按值抛出具有自动存储持续时间的异常对象
- 捕获方式(
)参考const
- 资源清理是自动处理的
throw new CMyException(_T("This operation failed."));
或
并忽略编译器警告。这是必需的,因为CATCH
宏将始终扩展到与指针类型匹配的CATCH
子句
如果调用代码使用C++异常处理,则没有值或指针抛出的问题,例如
throw CMyException(_T("This operation failed."));
// or
throw new CMyException(_T("This operation failed."));
并通过const
引用或指针捕捉:
catch( CException const& ) {
// no cleanup required
}
// or
catch( CException* e ) {
// manual cleanup still required, unless the exception is re-thrown
e->Delete();
}
在前面的代码段中,还允许同时使用catch
子句,允许您设置调用代码来处理在代码中按值抛出自定义异常的混合情况,以及调用MFC提供的代码来引发指针抛出的动态分配异常对象
甚至允许在一定程度上混合C++异常处理和MFC异常宏()。提供的信息仅用于完整性。不建议混合C++异常和MFC异常宏,除非有一个很好的理由这样做,例如当将现有代码从MFC异常宏逐渐过渡到C++异常处理时。我收到过这样的警告。一旦我恢复到“推荐的规则集”,这些类型的警告就停止了。@AndrewTruckle:因为我不知道规则集是什么,我会说不。转到项目设置,查找左侧的“代码分析”部分。展开“常规”节点。在其上是规则集的设置。是否已将其设置为Microsoft本机推荐规则?已将其设置为Microsoft所有规则。我将其更改为Microsoft本机推荐规则。这似乎已经消除了警告——谢谢。但我仍然不确定抛出自定义异常的最佳方式。只需抛出它们。例如,我使用了
抛出新的CChristianLifeMinistryEntryException(strError)代码>。
catch( CException const& ) {
// no cleanup required
}
// or
catch( CException* e ) {
// manual cleanup still required, unless the exception is re-thrown
e->Delete();
}