Visual studio 在Visual C+中引发自定义异常+;2019

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

MFC定义了抛出预定义异常的函数。例如,使用
::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
    子句都需要释放与异常对象关联的资源
P> >对比,处理C++异常的习惯方法遵循以下准则:

  • 按值抛出具有自动存储持续时间的异常对象
  • 捕获方式(
    const
    )参考
  • 资源清理是自动处理的
使用MFC,您可以使用上述任一项。MFC提供异常宏以帮助减少前者的错误倾向,尽管没有严格要求使用它们中的任何一个。事实上,已经几乎完全使用了引擎盖下的C++异常处理。 在MFC中引发自定义异常的正确方法取决于调用它的代码。如果该代码正在使用MFC异常宏,则需要抛出指向动态分配的异常对象的指针,例如

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();
}