例外,退货,可序列化,

时间:2009-04-21 18:52:02

标签: return-value serializable

throw Exception)和(return value)如何用Java或C#等语言实现?我想知道它的支持如何包含在语言中的机制,而不仅仅是try { .... } catch (Exception) {}的使用。

我们知道何时调用函数,即

public void doSomething() {
  ....
  ....
  return;
}

然后将调用放在堆栈上,当方法返回时,对堆栈的doSomething的调用弹出。

如果return语句返回一个值,例如return 4;,会发生什么情况, 弹出对堆栈上doSomething()的调用,并且Prog计数器上的下一个语句被处理了?返回值发生了什么变化?它在哪里被保存以及如何使用它?


类似地,在异常抛出的情况下,throw ex;语句在堆栈上找到相应的catch语句,并且在找到它之前,它会不断地将内容弹出堆栈...这个机制有用吗?

1 个答案:

答案 0 :(得分:2)

看看this article,看看它是否有帮助。它讨论了.NET(C#)异常系统的SEH基础。

修改

如果您问“如何使用参数和返回值调用C#和Java之类的方法”,请查看this article

在一个非常低的级别(我想你要问的),当你调用一个方法时,你将params推入堆栈,然后运行该函数,然后将堆栈的返回值弹出到一个register然后处理它,如下所示:

  • 从方法(汇编代码)返回
  • pop esx - 将值弹出堆栈并将其存储在EAX寄存器中
  • jz esx A01h - 如果EAX寄存器为零,请跳转到此位置。

编辑#2:

在异常的情况下,托管框架(Java,.NET等)开始一步一步地展开堆栈,寻找可以处理错误的“catch”或“finally”块。它一直这样做,直到它找到一些可以处理它的代码块,或者它耗尽代码并且只是终止程序。要了解所有这些在堆栈级别的工作方式取决于您所讨论的托管框架,但上面的第一篇文章与this article相结合将为您提供更深入的视图。