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)。
任何人都可以解释这个,或者参考一些当前的文档?
异常处理是其中显示的一个领域,即MFC在C ++之前的数量相当大。由于C ++异常是C ++标准的后期补充,MFC已经决定了它的异常处理策略:
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 ++异常处理时。