iosobjective-cnserror

Custom NSError codes


I am building a Cocoa Touch Framework which uses custom NSError object to communicated errors back to the caller. I need to declare an enum which defines custom error codes. I went to this Apple doc which lists NSURLErrorDomain error codes shown below:

enum {    
   NSURLErrorUnknown = -1,   
   NSURLErrorCancelled = -999,   
   NSURLErrorBadURL = -1000,    
   NSURLErrorTimedOut = -1001,   
   NSURLErrorUnsupportedURL = -1002,
   NSURLErrorUnsupportedURL = -1002,
   NSURLErrorCannotConnectToHost = -1004,   
   NSURLErrorDataLengthExceedsMaximum = -1103,   
   NSURLErrorNetworkConnectionLost = -1005,    
   NSURLErrorDNSLookupFailed = -1006,   
   NSURLErrorHTTPTooManyRedirects = -1007,    
   NSURLErrorResourceUnavailable = -1008,   
   NSURLErrorNotConnectedToInternet = -1009,   
   NSURLErrorRedirectToNonExistentLocation = -1010,   
   NSURLErrorBadServerResponse = -1011,   
   NSURLErrorUserCancelledAuthentication = -1012,   
   NSURLErrorUserAuthenticationRequired = -1013,   
   NSURLErrorZeroByteResource = -1014,   
   NSURLErrorCannotDecodeRawData = -1015,    
   NSURLErrorCannotDecodeContentData = -1016,    
   NSURLErrorCannotParseResponse = -1017,   
   NSURLErrorInternationalRoamingOff = -1018,    
   NSURLErrorCallIsActive = -1019,    
   NSURLErrorDataNotAllowed = -1020,    
   NSURLErrorRequestBodyStreamExhausted = -1021,   
   NSURLErrorFileDoesNotExist = -1100,    
   NSURLErrorFileIsDirectory = -1101,    
   NSURLErrorNoPermissionsToReadFile = -1102,    
   NSURLErrorSecureConnectionFailed = -1200,   
   NSURLErrorServerCertificateHasBadDate = -1201,   
   NSURLErrorServerCertificateUntrusted = -1202,   
   NSURLErrorServerCertificateHasUnknownRoot = -1203,   
   NSURLErrorServerCertificateNotYetValid = -1204,  
   NSURLErrorClientCertificateRejected = -1205,   
   NSURLErrorClientCertificateRequired = -1206,   
   NSURLErrorCannotLoadFromNetwork = -2000,    
   NSURLErrorCannotCreateFile= -3000,   
   NSURLErrorCannotOpenFile = -3001,   
   NSURLErrorCannotCloseFile = -3002,    
   NSURLErrorCannotWriteToFile = -3003,    
   NSURLErrorCannotRemoveFile = -3004,    
   NSURLErrorCannotMoveFile = -3005,   
   NSURLErrorDownloadDecodingFailedMidStream = -3006,   
   NSURLErrorDownloadDecodingFailedToComplete = -3007 
   }

Q1: Why Apple uses negative values for error codes? Is there any specific reason for that?

Q2: Is there any pattern does Apple follow to randomize error codes?


Solution

    1. Because based on return codes, 0 is usually OK. That leaves positive and negative integers. It's a general C preference to use positive integers for success codes (with additional info) and negative values for error codes.
    2. As you can see, the error codes are grouped. Unknown and cancelled are special, 1000s are HTTP errors, 1100s are access errors, 1200s are connection and cert errors, 2000 network, 3000s file and stream issues.

    Group your errors based on problem areas, and use negatives for return code purposes (since returning a negative will usually be interpreted as an error).