lanzando una excepción en Objective-c/cocoa
¿Cuál es la mejor manera de generar una excepción en Objective-c/cocoa?
Yo uso [NSException raise:format:]
lo siguiente:
[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];
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 .
@throw([NSException exceptionWith…])
Xcode reconoce @throw
declaraciones como puntos de salida de funciones, como return
declaraciones. El uso de la @throw
sintaxis 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, @throw
se puede utilizar para lanzar objetos que no sean de clase NSException.