Recover in Objective-C
#import <Foundation/Foundation.h>
// This function throws an exception.
void mayThrow() {
@throw [NSException exceptionWithName:@"SomeException"
reason:@"a problem"
userInfo:nil];
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// In Objective-C, we use @try, @catch, and @finally for exception handling.
@try {
mayThrow();
// This code will not run, because mayThrow() throws an exception.
// The execution of main stops at the point of the exception
// and jumps to the @catch block.
NSLog(@"After mayThrow()");
} @catch (NSException *exception) {
// The @catch block is equivalent to recover() in Go.
// It catches the thrown exception and allows the program to continue.
NSLog(@"Caught exception. Error:\n %@", [exception reason]);
} @finally {
// The @finally block always executes, whether an exception was thrown or not.
NSLog(@"Cleaning up...");
}
}
return 0;
}In Objective-C, we use exception handling mechanisms to recover from runtime errors, which is similar to recovering from panics in other languages. Here’s how it works:
We define a function
mayThrow()that throws an exception. This is similar to themayPanic()function in the original example.In the
main()function, we use an@try-@catch-@finallyblock to handle potential exceptions:- The
@tryblock contains the code that might throw an exception. - The
@catchblock catches any thrown exceptions. This is equivalent to therecover()functionality in the original example. - The
@finallyblock (optional) contains code that will be executed whether an exception was thrown or not.
- The
If
mayThrow()throws an exception, the execution immediately jumps to the@catchblock, skipping any code after the throw in the@tryblock.In the
@catchblock, we can examine the caught exception and handle it appropriately. In this case, we’re just printing the error message.
To run this program:
Save the code in a file with a
.mextension (e.g.,ExceptionHandling.m).Compile it using the Objective-C compiler:
$ clang -framework Foundation ExceptionHandling.m -o ExceptionHandlingRun the compiled program:
$ ./ExceptionHandling Caught exception. Error: a problem Cleaning up...
This example demonstrates how Objective-C handles exceptions, which is conceptually similar to recovering from panics in other languages. It allows your program to gracefully handle runtime errors and continue execution when possible.