【问题标题】: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 个不同的问题可能会很有用
  • 你只是编辑你的问题,现在完全不同了。
  • 抱歉,我认为这需要更多详细说明。

标签: return-value serializable


【解决方案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 将为您提供更深入的了解。

【讨论】:

  • 是的,我问的是低级的事情。谢谢我想出或多或少相同但想确认..感谢您的回答。
  • 如果这回答了你的问题,那么请标记并回答或删除问题(而不是让它成为孤立的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多