tag puede publicado manager gtm google encontrar dónde descargar código cuenta contenedor como colocar codigo objective-c cocoa core-data nserror

objective c - puede - Mejores prácticas: dominios y códigos NSError para su propio proyecto/aplicación



id tag manager (3)

Cómo crear un NSError personalizado:

Fist crea un Diccionario del mensaje de error

NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil), NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil) }; NSError *error = [NSError errorWithDomain:@"com.yourdomain.bundleidentifier" code:-58 userInfo:userInfo];

A continuación, asigne el userInfo al NSDictionary y su done.

Hay una publicación de SO anterior relacionada con la configuración de dominios de error para sus propios marcos, pero ¿cuál es la mejor práctica para configurar dominios de error y códigos de error personalizados para su propio proyecto / aplicación ?

Por ejemplo, supongamos que está trabajando en una aplicación intensiva de Data Core con muchas validaciones, en caso de que simplemente se quede con los códigos de error de Core Data (tales como NSManagedObjectValidationError de CoreDataErrors.h ) o debería crear la suya propia. MyAppErrors.h y define los errores con más especificidad (es decir, MyAppValidationErrorInvalidCombinationOfLimbs ?

La creación de un dominio de error personalizado y un conjunto de códigos de error podría desambiguar significativamente su código, pero ¿es demasiado alto para mantener y uno tiene que preocuparse por los conflictos de numeración del código de error? ¿O hay otras preocupaciones aquí?


No tengo suficiente representante para comentar, pero para la respuesta aceptada por Dave DeLong, podría ser un poco mejor usar [[NSBundle mainBundle] bundleIdentifier] lugar de @"com.myName.myProject" . De esta manera, si cambias el nombre o el nombre de tu proyecto, se reflejará con precisión.


Yo personalmente uso un dominio de estilo de DNS inverso. Por ejemplo:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

La tercera parte del dominio ( @"myproject" ) solo se utiliza para diferenciar los errores de este proyecto ( "My Project" ) de los errores en otro proyecto ( "My Other Project" => com.davedelong.myotherproject ).

Es una forma sencilla de garantizar que no voy a entrar en conflicto con los dominios de error de otra persona (si estoy usando un código de terceros), a menos que el desarrollador intente meterse solo conmigo (lo que creo que sería muy poco probable). ..).

En cuanto a los conflictos de numeración de código, no te preocupes por eso. Siempre que los códigos sean únicos dentro de un dominio , debería estar bien.

En cuanto a la traducción de errores, eso depende de usted. Hagas lo que hagas, asegúrate de documentarlo bien. Personalmente , por lo general, paso los errores generados por el framework a medida que se acercaban a mí, ya que nunca estoy seguro de poder manejar todos los códigos y traducir todo el userInfo en algo más específico para mi proyecto. Los marcos podrían cambiar y agregar más códigos, o cambiar el significado de los códigos existentes, etc. También me ayuda a identificar más específicamente de dónde vino el error. Por ejemplo, si mi framework StackKit genera un error en el dominio com.stackkit , sé que es un problema de framework. Sin embargo, si genera un error en NSURLErrorDomain , entonces sé que proviene específicamente del mecanismo de carga de URL.

Lo que podría hacer es capturar el error generado por el marco y envolverlo en un nuevo objeto de error que tenga su dominio y un código genérico, algo así como kFrameworkErrorCodeUnknown o algo, y luego colocar el error capturado en userInfo bajo NSUnderlyingErrorKey . CoreData hace esto mucho (por ejemplo, si intenta save: un NSManagedObjectContext , pero tiene errores de integridad de relación, obtendrá un solo error, pero NSUnderlyingErrorKey contendrá mucha más información, como específicamente qué relaciones son incorrectas, etc.)