如果从C#中的try或catch块返回,是否会执行finally块? 如果是这样,在返回之前或之后?
没有内容可用!
是的,执行finally
块,但是流离开try
块 – 无论是到达结尾,返回还是抛出exception。
从C#4规范,第8.10节:
当控制离开try语句时,总是执行finally块的语句。 无论控制转移是作为正常执行的结果发生,还是由于执行break,continue,goto或return语句,或者是由于将exception传播出try语句而导致的。
(当然,第8.10节有更详细的内容。)
请注意,返回值是在执行finally块之前确定的,所以如果你这样做:
int Test() { int result = 4; try { return result; } finally { // Attempt to subvert the result result = 1; } }
…仍将返回值4,而不是1 – finally
块中的赋值将不起作用。
将始终执行finally块,这将在从方法返回之前发生,因此您可以安全地编写如下代码:
try { return "foo"; } finally { // This will always be invoked }
或者如果您正在使用一次性资源:
using (var foo = GetFoo()) { // foo is guaranteed to be disposed even if an exception is thrown return foo.Bar(); }
对于.NET从Windowsinheritance的两遍exception处理,您无法准确地说finally块在控制权传递给调用者之前执行。
finally块将在更多嵌套调用帧中的finally块之后执行,并且在最终块之前执行,并且在较少嵌套的调用帧中执行catch块,这与在返回之前运行的finally块一致。 但是抛出点和捕获点之间的所有exceptionfilter都将在任何finally块之前运行,这意味着在出现exception时,一些调用者代码可以在finally块之前运行。
当控件正常离开块时(没有抛出exception),则最终在控制返回调用者之前运行。
如果从C-Sharp中的try或catch块返回,是否会执行finally块?
是
如果它会,返回之前或之后?
之前
- Web API返回转义的JSON
- C#7 ValueTuple编译错误
- 自定义TaskScheduler,SynchronizationContext?
- 设置JsonConvert.DefaultSettings asp net core 2.0不能按预期工作
- entity framework(代码优先) – 动态构建模型
- Web服务方法返回Response对象而不是自定义对象
- Entity Framwork 7.0.0-rc1-final现有数据库“数据库优先”的逆向工程师
- 为什么Dictionary <T1,List >不能转换为Dictionary <T1,IEnumerable >?
- 用于提取String的某些部分的正则表达式