如何使用嵌套的try-catch-finally语句和C中的消息实现exception

我正在寻找用nestable try-catch-finally语句实现exception,并使用longjmp / setjmp在C中使用消息。

我设法实现了try-catch-elseexception,它们不可嵌套。 我也希望在exception中添加消息。 知道我怎么能这样做吗?

Dave Hanson已经完成了一个非常好的exception宏包,作为他出色的C接口和实现的一部分 。 您既可以使用批发代码,也可以从他的技术中学习。 对于那些进行了大量C编程的人来说,这本书值得购买 – 它将改变你对C编程的改变方式,它将向你展示如何在C语言中进行面向对象的设计。

用于嵌套:当前try / catch块的堆栈帧。

你的尝试将使用setjmp保存到jmpbuffer(我猜)。 如果你已经尝试了,因此现在处于try块的范围内并进行另一次尝试,那么你想要保留现有的jmpbuffer并创建一个新的 – Push – 当你捕获时你很长时间回到最近的尝试点,因此你弹出最新的jmpbuffer。 所以我认为类似堆栈的模型对于嵌套的try / catch是有意义的。

为了实现,我想最简单的方法是保留一个jmpbuffers数组,从而限制你的try catch深度 – 但要保持简单; Push和Pop只需要您跟踪该数组中的索引。

对于消息和其他exception内容,“currentException”的保留区域。

例外内容。 保持简单,定义一个Exception结构。 char数组和int。 保持简单,但不是太简单,保留它们的数组,以便您可以支持链接。

对于你允许的投掷

throw ( "string", errcode ) 

这简单地将数组结构归零并进行一次输入。 和

  catch ( exception ) 

现在可以查看数组并找到第一个条目,然后

  throwChain ( "string", errcode) 

这会将新的exception添加到数组中(如果有空间,如果没有则可以根据某些规则(如FIFO)对数组进行洗牌)

但是,我必须问,为什么不使用C ++?

好吧,你不能真正在C中实现exception,因为语言不支持它们。 您可以做的最好的事情是使用setjmplongjmp以及一些恶魔聪明的宏来模拟它们。

快速搜索会显示这些可能对您有用的链接:

  • C中的例外情况
  • 使用longjmp()进行exception处理