异常,返回,可序列化,

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 小部件传递可序列化对象会产生空指针异常

在 symfony 中反序列化对象返回异常 [关闭]

ABP 日志审计 返回值开启 循环引用序列化异常 Self referencing loop detected

java notserializableexception但实现了可序列化

GWT 序列化异常