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

问题描述 投票:1回答:1

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)。

任何人都可以解释这个,或者参考一些当前的文档?

visual-studio exception visual-c++ mfc
1个回答
0
投票

异常处理是其中显示的一个领域,即MFC在C ++之前的数量相当大。由于C ++异常是C ++标准的后期补充,MFC已经决定了它的异常处理策略:

  • 在freestore上分配异常对象。
  • 扔指针。
  • 抓住指针。
  • 任何处理异常的catch子句都需要释放与异常对象关联的资源。

相比之下,处理C ++异常的惯用方法遵循以下准则:

  • 按值自动存储具有自动存储持续时间的异常对象。
  • 赶上(const)参考。
  • 资源清理自动处理。

使用MFC,您可以使用上述任何一种。 MFC提供了异常宏来帮助使前者不易出错,尽管没有严格要求使用它们中的任何一个。实际上,exception macros in version 3.0已经转向几乎完全使用C ++异常处理。

在MFC中抛出自定义异常的正确方法取决于调用它的代码。如果该代码使用MFC异常宏,则需要抛出指向动态分配的异常对象的指针,例如,

throw new CMyException(_T("This operation failed."));

要么

THROW( (CException*) 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异常宏(Exceptions: Using MFC Macros and C++ Exceptions)。提供的信息仅用于完整性。建议不要混用C ++异常和MFC异常宏,除非有充分理由这样做,例如:当逐步将现有代码从MFC异常宏使用转换为C ++异常处理时。

© www.soinside.com 2019 - 2024. All rights reserved.