异常:将MFC异常宏

这是一个高级主题。

本文演示如何将现有代码编写使用 Microsoft 基础类宏 — TRYCATCHTHROW,等等 )使用异常处理关键字 trycatch和 throw的 C++。 主题包括:

  • 转换优点

  • 将带异常宏的代码为使用 C++ 异常

转换的优点

您可能不需要转换现有代码,不过,您应了解在宏实现在 MFC 3.0 版和实现之间的区别以及早期版本。 这些差异以及后续更改在代码行为在 异常:对于异常宏的更改在 3.0 版中讨论。

转换的主要优点为:

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

  • 异常处理关键字的 C++ 更通用的:它们可以可以复制任何数据类型的异常 (int、 float, char,等等),宏,而只处理异常类 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++ 异常

请参见

概念

异常处理在MFC