请考虑以下代码:
@try {
if (something.notvalid)
{
return;
}
// do something else
} @catch (NSException *ex) {
// handle exception
} @finally {
NSLog(@"finally!");
}
如果something
无效且我在try中返回,@finally
中的代码是否执行?我相信,除了我所说过的其他人不应该这么认为,我现在无法对此进行测试。
答案 0 :(得分:15)
答案 1 :(得分:4)
是。奇怪的是,确实如此。我不知道为什么,但我只是建立了一个测试并尝试了许多配置,每次都这样做。
以下是配置:
答案 2 :(得分:2)
使用RAI定义,无论如何,最终块将使用该代码范围执行,特别是资源。
它与对象的~Destructor
有着密切的关系。与对象的~Destructor
总是执行一样,最后块也会执行。
答案 3 :(得分:1)
是。即使Exception
块中有catch
,也会执行finally
。
如果您熟悉C ++,请将finally
视为destructor
的{{1}}。什么状态的对象object
中的语句将被执行。
但你不能把~Destructor
放在return
[虽然有些编译器允许]。
请参阅以下代码:了解全局变量finally
的更改方式。
另请参阅y
Exception1
如何涵盖Exception2
。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace finallyTest
{
class Program
{
static int y = 0;
static int testFinally()
{
int x = 0;
try
{
x = 1;
throw new Exception("Exception1");
x = 2;
return x;
}
catch (Exception e)
{
x = -1;
throw new Exception("Exception2", e);
}
finally
{
x = 3;
y = 1;
}
return x;
}
static void Main(string[] args)
{
try
{
Console.WriteLine(">>>>>" + testFinally());
}
catch (Exception e)
{ Console.WriteLine(">>>>>" + e.ToString()); }
Console.WriteLine(">>>>>" + y);
Console.ReadLine();
}
}
}
输出:
>>>>>System.Exception: Exception2 ---> System.Exception: Exception1
at finallyTest.Program.testFinally() in \Projects\finallyTest\finallyTest\Program.cs:line 17
--- End of inner exception stack trace ---
at finallyTest.Program.testFinally() in \Projects\finallyTest\finallyTest\Program.cs:line 24
at finallyTest.Program.Main(String[] args) in \Projects\finallyTest\finallyTest\Program.cs:line 38
>>>>>1
答案 4 :(得分:0)
是的,这是一个示例代码段,输出是
试试吧! 抓住! 最后!
@try {
NSLog(@"try!");
NSException *e = [NSException
exceptionWithName:@"No Name"
reason:@"No Reason"
userInfo:nil];
@throw e;
} @ catch (...)
{
NSLog(@"catch!");
return;
}
@finally
{
NSLog(@"finally!");
}
NSLog (@"other code");