(throw Exception
)和(return value
)如何用Java或C#等语言实现?我想知道它的支持如何包含在语言中的机制,而不仅仅是try { .... } catch (Exception) {}
的使用。
我们知道何时调用函数,即
public void doSomething() {
....
....
return;
}
然后将调用放在堆栈上,当方法返回时,对堆栈的doSomething
的调用弹出。
如果return语句返回一个值,例如return 4;
,会发生什么情况,
弹出对堆栈上doSomething()
的调用,并且Prog计数器上的下一个语句被处理了?返回值发生了什么变化?它在哪里被保存以及如何使用它?
类似地,在异常抛出的情况下,throw ex;
语句在堆栈上找到相应的catch
语句,并且在找到它之前,它会不断地将内容弹出堆栈...这个机制有用吗?
答案 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相结合将为您提供更深入的视图。