异常:将MFC异常宏
这是一个高级主题。
本文演示如何将现有代码编写使用 Microsoft 基础类宏 — TRY, CATCH, THROW,等等 )使用异常处理关键字 try、 catch和 throw的 C++。 主题包括:
转换优点
将带异常宏的代码为使用 C++ 异常
转换的优点
您可能不需要转换现有代码,不过,您应了解在宏实现在 MFC 3.0 版和实现之间的区别以及早期版本。 这些差异以及后续更改在代码行为在 异常:对于异常宏的更改在 3.0 版中讨论。
转换的主要优点为:
代码使用异常处理关键字的 C++ 编译为稍微小的 .EXE 或 .DLL。
异常处理关键字的 C++ 更通用的:它们可以可以复制任何数据类型的异常 (int、 float, char,等等),宏,而只处理异常类 CException ,类从其派生的。
,当异常超出范围时,宏和关键字之间的主要差异在于该代码使用宏 “自动”删除所捕获的异常。 使用关键字的代码不,因此,您必须显式删除所捕获的异常。 有关更多信息,请参见中的文章 异常:捕获和删除异常。
另一个差异是语法。 宏和关键字的语法在三个方面不同:
宏参数和异常声明:
CATCH 宏调用具有以下语法:
CATCH(exception_class, exception_object_pointer_name)
请注意在类名和对象指针之间的逗号命名。
catch 关键字的异常声明使用此语法:
catch(exception_typeexception_name)
此异常声明语句指示异常的类型 catch 块处理。
catch 块的分隔符:
宏, CATCH 宏 (带有参数) 启动第一个 catch 块; AND_CATCH 宏启动后续 catch 块,并且, END_CATCH 宏停止 catch 块序列。
关键字, catch 关键字 (与其异常声明) 开始每个 catch 块。 没有对等项 END_CATCH 宏;catch 块与其右大括号的末尾。
引发表达式:
宏使用 THROW_LAST 再次引发当前异常。 throw 关键字,没有参数,它具有相同的效果。
执行转换
转换代码使用宏使用异常处理关键字的 C++
找到 MFC 宏 TRY、 CATCH、 AND_CATCH、 END_CATCH、 THROW和 THROW_LAST的所有匹配项。
替换或删除以下宏的所有匹配项:
TRY (将替换为 try替换它)
CATCH (将替换为 catch替换它)
AND_CATCH (将替换为 catch替换它)
END_CATCH (删除它)
THROW (将替换为 throw替换它)
THROW_LAST (将替换为 throw替换它)
修改相应宏参数,以便形成有效的异常声明。
例如,可更改
CATCH(CException, e)
设置为
catch(CException* e)
修改 catch 块中的代码块,以便根据需要删除异常对象。 有关更多信息,请参见中的文章 异常:捕获和删除异常。
使用 MFC 异常宏,这是异常处理代码的示例。 请注意,由于在下面的示例中的代码使用宏,异常 e 自动删除:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
在下一示例中的代码使用 C++ 异常关键字,因此,必须显式删除异常:
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch(CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
有关更多信息,请参见 异常:使用 MFC 宏和 C++ 异常。