异常:从 MFC 异常宏转换

这是一个高级主题。

本文介绍如何转换使用Microsoft基础类宏( TRYCATCHTHROW 等)编写的现有代码,以使用C++异常处理关键字 trycatch以及 throw。 主题包括:

转换的优点

你可能不需要转换现有代码,尽管你应该知道 MFC 版本 3.0 中的宏实现与早期版本中的实现之间的差异。 异常中讨论了这些差异和代码行为的后续更改 :版本 3.0 中的异常宏更改

转换的主要优点是:

  • 使用C++异常处理关键字的代码编译为略小的.EXE或.DLL。

  • C++异常处理关键字更为通用:它们可以处理可复制的任何数据类型(intfloatchar等)的异常,而宏仅处理派生自它的类 CException 和类的异常。

宏和关键字之间的主要区别在于,当异常超出范围时,使用宏的代码“自动”将删除捕获的异常。 使用关键字的代码不会,因此必须显式删除捕获的异常。 有关详细信息,请参阅 “异常:捕获和删除异常”一文。

另一个区别是语法。 宏和关键字的语法在三个方面有所不同:

  1. 宏参数和异常声明:

    CATCH 宏调用具有以下语法:

    CATCH(exception_classexception_object_pointer_name

    请注意类名和对象指针名称之间的逗号。

    关键字的 catch 异常声明使用此语法:

    catch(exception_typeexception_name

    此异常声明语句指示 catch 块句柄的异常类型。

  2. catch 块的分隔:

    使用宏时, CATCH 宏(及其参数)开始第一个 catch 块; AND_CATCH 宏开始后续 catch 块, END_CATCH 宏终止 catch 块序列。

    使用关键字时, catch 关键字(其异常声明)将开始每个 catch 块。 没有与 END_CATCH 宏相对应的宏;catch 块以右大括号结尾。

  3. 引发表达式:

    宏使用 THROW_LAST 重新引发当前异常。 throw没有参数的关键字具有相同的效果。

执行转换

使用宏转换代码以使用C++异常处理关键字

  1. 找到 MFC 宏 TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST的所有匹配项。

  2. 替换或删除以下宏的所有匹配项:

    TRY (将其替换为 try

    CATCH (将其替换为 catch

    AND_CATCH (将其替换为 catch

    END_CATCH (删除)

    THROW (将其替换为 throw

    THROW_LAST (将其替换为 throw

  3. 修改宏参数,使其形成有效的异常声明。

    例如,更改

    CATCH(CException, e)
    

    catch (CException* e)
    
  4. 修改 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++异常

另请参阅

异常处理