2012-03-13 7 views
5

Me enteré de que Objective C tiene una forma equivalente de manejar excepciones como C# en .NET. Además, como dice Apple Docs, me gustaría manejar/procesar excepciones, creando un objeto NSError. Tomando una mirada cercana a la sección "La captura de diferentes tipos de Excepción" en la documentación exception handling¿Cuál es el enfoque correcto para el manejo de excepciones en iOS?

.... Me gustaría capturar diferentes tipos de excepción. En .NET, estoy acostumbrado a navegar por el documento de un método de clase para obtener las posibles excepciones que puede generar. ¿Dónde obtener esta información de los Apple-Docs? ¿Cómo puedo saber qué tipo de excepciones puede generar un método/objeto/proceso?

gracias por sus sugerencias

Tom

Respuesta

5

Como dice la documentación de Apple, la mayoría de las excepciones se producen en circunstancias excepcionales. (Algunas excepciones no son, como acceder a un objeto fuera de los límites de NSArray).

.NET fomenta el manejo de excepciones locales. Cocoa está escrito para fomentar el manejo de excepciones de gran alcance. La razón por la que tiene el manejo de excepciones locales en .NET es que espera que alguna parte falle de manera esperada (como un error de red al descargar algo). En Cocoa, esto se maneja usando métodos que devuelven NSErrors. Es lo mismo, solo que más visible en la firma del método.

Una buena regla general es que Cocoa solo arroja una excepción en situaciones donde no está claro cómo se recuperaría. (No confundir esto con excepciones que son lanzadas por todo el lugar como en .NET y siendo esto sea difícil de manejar.)

+0

¡gracias por tu aporte! – Tom

2

Mira el developer reference for exception handling. En Cocoa no obtenemos excepciones como nilArgumentException, obtenemos solo NSException. Para dar el mensaje de grano fino o manipulación se puede hacer lo siguiente,

if ([[exception name] isEqualToString:MyAppException]) 

A continuación se muestra la lista de nombres de excepción definidos en el archivo de cabecera NSException.

FOUNDATION_EXPORT NSString * const NSGenericException; 
FOUNDATION_EXPORT NSString * const NSRangeException; 
FOUNDATION_EXPORT NSString * const NSInvalidArgumentException; 
FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException; 

FOUNDATION_EXPORT NSString * const NSMallocException; 

FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException; 
FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException; 
FOUNDATION_EXPORT NSString * const NSDestinationInvalidException; 

FOUNDATION_EXPORT NSString * const NSPortTimeoutException; 
FOUNDATION_EXPORT NSString * const NSInvalidSendPortException; 
FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException; 
FOUNDATION_EXPORT NSString * const NSPortSendException; 
FOUNDATION_EXPORT NSString * const NSPortReceiveException; 

FOUNDATION_EXPORT NSString * const NSOldStyleException; 

CORRECCIÓN:

Usted puede subclase clase NSException, como se sugiere en uno de los comentarios a continuación, para atrapar excepción personalizada.

+1

No hay nada que te impida subclasificar NSException y atrapar tipos específicos en el bloque '@ catch' para tu propio código. –

+0

gracias por su respuesta – Tom

+0

@GrahamLee. Tienes mucha razón. Definitivamente puedes extender. También comenzó a seguir tu blog :) – Vignesh

5

manipulación en el mundo de Objective-C de error es probablemente muy diferente de lo que estamos acostumbrados . Para decirlo brevemente, olvídate de las excepciones. La mayoría de los errores son manejados por los valores de retorno o pasando un puntero a NSError*:

NSErrror *error = nil; 
BOOL success = [somebody doSomethingWithError:&error]; 
if (!success) { 
    NSLog(@"Got error: %@", error); 
} 

Y en el lado del abonado llamado:

- (BOOL) doSomethingWithError: (NSError**) error 
{ 
    error = error ? error : &(NSError*){ nil }; 
    if (somethingWentWrong) { 
     *error = [NSError …]; 
     return NO; 
    } 
    // All is fine 
    return YES; 
} 

Esto parece complicado, pero en la práctica sobre todo funciona bien. En la rara ocasión en que algo realmente puede arrojar una excepción (como [NSFileHandle writeData:]), la documentación menciona el hecho, pero no creo que deba analizar la excepción tanto como la habitual en otros idiomas.

+0

Hola zoul, gracias por tu respuesta. solo para mi propia tranquilidad-> esto significa que una buena práctica sería construir un bloque try & catch proforma-wise alrededor de todo el código en mi proyecto (en caso de que olvidara manejar algo correctamente -como verificar un valor nulo) para evitar el software de estrellarse. y de lo contrario, sigo desarrollando y no me preocupo más por el manejo de excepciones. -o simplemente construya una prueba y bloque de captura alrededor de mi método principal, porque una excepción sin manos terminará allí de todos modos (y luego regístrela o presente un mensaje al usuario) – Tom

+0

Los objetos "nulos" se manejan de forma diferente en Objective- C, es legal enviar un mensaje a un objeto 'nil'. A veces es un buen ahorro de tiempo y, a veces, un buen error esperando a suceder. En su mayoría, puede olvidarse de los bloques try/catch en Objective-C. Cada vez que llame a algo que puede fallar, observe cómo se devolverá el error. En la mayoría de los casos, obtendrás un 'NSError', así que es obvio por la firma del método. En el pequeño número de casos restantes, la documentación le dirá que el método podría arrojar, por lo que necesitará un bloque de prueba/captura allí. De nuevo, tales situaciones son raras. – zoul

+0

gracias por su entrada, ¡¡aplausos !!! – Tom

Cuestiones relacionadas