这是一个高级主题。
本文介绍如何转换使用Microsoft基础类宏( TRY、 CATCH、 THROW 等)编写的现有代码,以使用C++异常处理关键字 try
, catch
以及 throw
。 主题包括:
转换的优点
你可能不需要转换现有代码,尽管你应该知道 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++异常。