Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果方法引发异常,则从该方法返回值_C#_.net_Exception Handling - Fatal编程技术网

C# 如果方法引发异常,则从该方法返回值

C# 如果方法引发异常,则从该方法返回值,c#,.net,exception-handling,C#,.net,Exception Handling,又是星期一了,我有一个关于C#basics的问题。如果方法抛出异常,该方法的返回值会发生什么变化 具体地说,当在方法中抛出异常时,“幕后”发生了什么?这对返回值有什么影响?在这种情况下,如何在内部计算返回值 假设有两种情况:一种是返回值的类型为int,另一种类型为object。当异常发生时,default(T)是否将在内部调用?在这种情况下,我应该考虑类型 int 的返回值是否为零,而对象的返回值为“代码> null ?< P>。简短的,过于简单的回答是:它不会返回任何< /强>。无论异常发生在

又是星期一了,我有一个关于C#basics的问题。如果方法抛出异常,该方法的返回值会发生什么变化

具体地说,当在方法中抛出异常时,“幕后”发生了什么?这对返回值有什么影响?在这种情况下,如何在内部计算返回值


假设有两种情况:一种是返回值的类型为
int
,另一种类型为
object
。当异常发生时,
default(T)
是否将在内部调用?在这种情况下,我应该考虑类型<代码> int <代码>的返回值是否为零,而对象的返回值为“代码> null ?

< P>。简短的,过于简单的回答是:<强>它不会返回任何< /强>。无论异常发生在何处,代码都会“中断”,并沿着堆栈向下移动,直到有东西捕获它

即使您碰巧捕获到异常,您试图用方法的返回值初始化的变量仍将保持在调用方法之前的状态:

var i = 5;

try
{
    i = MyMethodThatThrowsAnException();
}
catch
{
    // at this point, the i variable still equals 5.
}

我应该提到,如果函数抛出异常,您真的不应该担心它的返回值。如果您这样做了,那么很可能您做错了什么,例如使用。

进行主要简化:

当抛出异常时,.Net CLR开始搜索堆栈,直到找到可以处理该异常的异常处理程序

此时,将调整堆栈指针,以便使用来自正确点的正确参数运行异常处理代码。(异常本身在抛出点捕获堆栈信息,以使该信息在捕获点可用。)

实际上,CLR执行了一种“goto”,它跳过任何可能使用抛出异常的函数的任何返回值的代码,因此返回值根本不相关。在此场景中,它从未被创建、使用或需要

请注意,这是对实际发生情况的一个巨大简化,但需要注意的主要一点是,出现了一种复杂的goto(遍历堆栈帧)。这就是返回值不相关的原因


如果我这样做怎么办
int I=MyMethod()
那里的返回值是什么?@devhedgehog这里是一样的:函数不会返回,因此变量不会初始化。事实上,即使是这样,在这种情况下,您甚至不能使用该值,因为异常会导致代码跳转到它找到的第一个catch块,跳出声明的变量范围。