lanzando una excepción en Objective-c/cocoa

Resuelto Steph Thirion asked hace 15 años • 13 respuestas

¿Cuál es la mejor manera de generar una excepción en Objective-c/cocoa?

Steph Thirion avatar Nov 28 '08 00:11 Steph Thirion
Aceptado

Yo uso [NSException raise:format:]lo siguiente:

[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];
e.James avatar Nov 27 '2008 17:11 e.James

Una palabra de precaución aquí. En Objective-C, a diferencia de muchos lenguajes similares, generalmente se debe intentar evitar el uso de excepciones para situaciones de error comunes que pueden ocurrir durante el funcionamiento normal.

La documentación de Apple para Obj-C 2.0 establece lo siguiente: "Importante: Las excepciones consumen muchos recursos en Objective-C. No debe usar excepciones para el control de flujo general o simplemente para indicar errores (como que no se puede acceder a un archivo)".

La documentación conceptual de manejo de excepciones de Apple explica lo mismo, pero con más palabras: "Importante: debe reservar el uso de excepciones para programación o errores inesperados de tiempo de ejecución, como acceso a colecciones fuera de límites, intentos de mutar objetos inmutables, envío de un mensaje no válido. , y perder la conexión con el servidor de Windows. Por lo general, usted se ocupa de este tipo de errores con excepciones cuando se crea una aplicación en lugar de en tiempo de ejecución. [.....] En lugar de excepciones, objetos de error (NSError) y el El mecanismo de entrega de errores de Cocoa es la forma recomendada de comunicar los errores esperados en las aplicaciones de Cocoa".

Las razones de esto son en parte para adherirse a los modismos de programación en Objective-C (usando valores de retorno en casos simples y parámetros por referencia (a menudo la clase NSError) en casos más complejos), en parte porque lanzar y detectar excepciones es mucho más costoso y Finalmente (y quizás lo más importante) que las excepciones de Objective-C son una envoltura delgada alrededor de las funciones setjmp() y longjmp() de C, esencialmente arruinando el manejo cuidadoso de la memoria, vea esta explicación .

harms avatar Nov 27 '2008 23:11 harms
@throw([NSException exceptionWith…])

Xcode reconoce @throwdeclaraciones como puntos de salida de funciones, como returndeclaraciones. El uso de la @throwsintaxis evita advertencias erróneas de " El control puede llegar al final de la función no nula " que puede recibir de [NSException raise:…].

Además, @throwse puede utilizar para lanzar objetos que no sean de clase NSException.

Peter Hosey avatar Nov 27 '2008 18:11 Peter Hosey