LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 292|回复: 0

C 异常包装类

[复制链接]
发表于 2024-2-6 23:05:28 | 显示全部楼层 |阅读模式
在与上述类似的简单示例中,C 异常只能由省略号 (...) catch 处理程序捕获。 有关类型或异常性质的信息不传递给该处理程序。 尽管此方法有效,但在某些情况下,你可能需要定义两个异常处理模型之间的转换,使每个 C 异常与一个特定类关联。 要进行转换,你可定义 C 异常“包装”类,可使用该类或从中进行派生来将特定类类型特性化为 C 异常。 这样,每个 C 异常都可以由特定的 C++ catch 处理程序单独处理,而不是在单个处理程序中处理所有异常。

您的包装器类可能有一个接口,该接口包含一些成员函数,用来确定异常的值以及访问 C 异常模型提供的扩展异常上下文信息。 你可能还希望定义一个默认构造函数、一个接受 unsigned int 参数(用于提供基础 C 异常表示形式)的构造函数和一个按位复制构造函数。 下面是 C 异常包装类的一个可能的实现:

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};
要使用此类,请安装每次引发 C 异常时由内部异常处理机制调用的自定义 C 异常转换函数。 在转换函数中,可引发可由适当匹配的 C++ catch 处理程序捕获的任意类型的异常(可能是 SE_Exception 类型,或派生自 SE_Exception 的类类型)。 转换函数可能直接返回,这表示它没有处理异常。 如果转换函数本身引发了 C 异常,则会调用 terminate。

若要指定自定义转换函数,请使用转换函数的名称作为 _set_se_translator 函数的单一参数来调用它。 对于具有 try 块的堆栈上的每个函数调用,将调用一次编写的转换器函数。 没有默认转换函数;如果你未通过调用 _set_se_translator 来指定转换函数,C 异常只能由省略号 catch 处理程序捕获。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表