Chapter 8: Tackling Those Pesky Errors
Error management can be one of the most frustrating parts of development. It’s hard enough getting everything to work when things go well, but to build really great apps you need to manage things gracefully when they go wrong. Cocoa provides some tools to make the job easier.
In this chapter you learn the major patterns that Cocoa uses to handle errors that you should use in your own projects. You also learn the major error-handling tools, including assertions, exceptions, and
NSError objects. Because your program may crash in the field, you learn how to get those crash reports from your users, and how to log effectively and efficiently.
Error Handling Patterns
There are several useful approaches to handling errors. The first and most obvious is to crash. This isn’t a great solution, but don’t discount it too quickly. I’ve seen a lot of very elaborate code around handling extremely unlikely errors, or errors you won’t be able to recover from anyway. The most common of these is failure to allocate memory. Consider the following code:
NSString *string = [NSString stringWithFormat:@”%d”, 1];
NSArray *array = [NSArray arrayWithObject:string];
It is conceivable (not really, but let’s pretend) that
stringWithFormat: might fail because Foundation isn’t able to allocate memory. In that case it returns
nil, and the call to
arrayWithObject: throws an exception for trying to insert
nil into an array, and your app probably crashes. You could (and ...