异常,返回,可序列化,
Posted
技术标签:
【中文标题】异常,返回,可序列化,【英文标题】:Exception, Return, Serializable, 【发布时间】:2010-10-20 22:01:13 【问题描述】:(throw Exception
) 和 (return value
) 如何用 Java 或 C# 等语言实现?我想知道它的支持如何包含在语言中的机制,而不仅仅是try .... catch (Exception)
的用法。
我们知道什么时候调用一个函数,即
public void doSomething()
....
....
return;
然后on调用被放入栈中,当方法返回时调用栈上的doSomething
弹出。
在 return 语句返回一个值的情况下会发生什么,比如return 4;
,
堆栈上对doSomething()
的调用弹出,Prog 计数器上的下一条语句得到处理?返回值发生了什么?它在哪里保存以及如何使用?
同样在抛出异常的情况下,throw ex;
语句会在堆栈上找到适当的 catch
语句,直到找到它,它才会不断地从堆栈中弹出东西......这个机制是如何工作的?
【问题讨论】:
如果您将其编辑为 2 个不同的问题可能会很有用 你只是编辑你的问题,现在完全不同了。 抱歉,我认为这需要更多详细说明。 【参考方案1】:看看this article 看看它是否有帮助。它讨论了 .NET (C#) 异常系统的 SEH 基础。
编辑:
如果您问“如何在 C# 和 Java 中调用带有参数和返回值的方法”,请查看 this article。
在一个非常低的级别(我想你在问什么),当你调用一个方法时,你将你的参数压入堆栈,然后运行函数,然后将堆栈的返回值弹出到一个register 然后对其进行处理,如下所示:
从方法返回(汇编代码)pop esx
- 从堆栈中弹出值并将其存储在 EAX 寄存器中
jz esx A01h
- 如果 EAX 寄存器为零,则跳转到该位置。
编辑 #2:
在发生异常的情况下,托管框架(Java、.NET 等)开始逐步展开堆栈,以寻找可以处理错误的“catch”或“finally”块。它会一直这样做,直到找到一些可以处理它的代码块,或者它用完代码并终止程序。要了解这一切在堆栈级别如何工作取决于您所谈论的托管框架,但上面的第一篇文章结合this article 将为您提供更深入的了解。
【讨论】:
是的,我问的是低级的事情。谢谢我想出或多或少相同但想确认..感谢您的回答。 如果这回答了你的问题,那么请标记并回答或删除问题(而不是让它成为孤立的)以上是关于异常,返回,可序列化,的主要内容,如果未能解决你的问题,请参考以下文章
从 stackview 小部件传递可序列化对象会产生空指针异常
ABP 日志审计 返回值开启 循环引用序列化异常 Self referencing loop detected