Consider the following code:
@try {
if (something.notvalid)
{
return;
}
// do something else
} @catch (NSException *ex) {
// handle exception
} @finally {
NSLog(@"finally!");
}
If something
is not valid and I return from within the try, does the code in @finally
execute or not? I believe that it should but others I've spoken to don't think so and I'm unable to test this at the moment.
Yes. Oddly enough, it does. I'm not sure why, but I just built a test and tried a number of configurations and every time it did.
Here were the configs:
- Return in try block: stopped execution of try block and caused finally to be executed
- Return in try block and return in finally: stopped execution of try and stopped execution in finally block and the entire method.
- Return in finally block: functioned like normal return outside of a try/catch/finally block.
With the RAI definition, Finally block will anyhow executed with that code scope, for particular resource.
It has a close meaning with Object's ~Destructor
. As same as an object's ~Destructor
always executes, finally block also executes.
Yes. Even if there was an Exception
within catch
block, finally
will be executed.
If you are familiar with C++, just think finally
as the destructor
of an object
. What ever the state of a statement within the object, ~Destructor
will be executed.
But you cant put return
within finally
[some compilers allow though].
See the code below: See how global variable y
been changed.
Also see how Exception1
been covered by 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();
}
}
}
output:
>>>>>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
Yes, here is a sample snippet, the output is
try! catch! finally!
@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");
来源:https://stackoverflow.com/questions/2969018/does-code-in-finally-get-run-after-a-return-in-objective-c