Un NSAssert generará una excepción cuando falle. Por lo tanto, NSAssert está ahí para ser una forma corta y fácil de escribir y verificar cualquier suposición que haya hecho en su código. No es (en mi opinión) una alternativa a las excepciones, solo un atajo. Si una afirmación falla, algo ha ido terriblemente mal en su código y el programa no debería continuar.
Una cosa a tener en cuenta es que NSAssert no se compilará en su código en una versión de lanzamiento, por lo que generalmente se usa para verificar la cordura durante el desarrollo. De hecho, tiendo a usar una macro de aserción personalizada que siempre está activa.
Las veces en que usaría @throw
su propia NSException es cuando definitivamente la desea en una versión de lanzamiento, y en cosas como bibliotecas públicas / interfaz cuando algunos argumentos no son válidos o se le ha llamado incorrectamente. Tenga en cuenta que no es una práctica estándar hacer @catch
una excepción y continuar ejecutando su aplicación. Si intenta esto con algunas de las bibliotecas estándar de Apple (por ejemplo, Core Data), pueden suceder cosas malas. De manera similar a una afirmación, si se lanza una excepción, la aplicación generalmente debería terminar con bastante rapidez porque significa que hay un error de programación en alguna parte.
NSErrors debe usarse en sus bibliotecas / interfaces para errores que no son errores de programación y de los que se pueden recuperar. Puede proporcionar información / códigos de error a la persona que llama y ellos pueden manejar el error limpiamente, alertar al usuario si corresponde y continuar con la ejecución. Por lo general, esto sería para cosas como un error de archivo no encontrado o algún otro error no fatal.
La convención en Cocoa es que una excepción indica un error del programador. Una gran cantidad de código, incluido el código marco, no está diseñado para funcionar correctamente después de que se lanza una excepción.
Cualquier tipo de error que deba recuperarse se representa con un
NSError
. También hay un sistema para presentarNSError
correos electrónicos al usuario. Como usted dice, esto es principalmente útil para recursos externos falibles.Conceptualmente, una aserción es una declaración de que un predicado dado siempre se evalúa como verdadero; si no es así, el programa no funciona. Si bien su comportamiento se puede modificar, la
NSAssert
familia es por defecto una forma conveniente de lanzarNSInternalInconsistencyException
s (con la opción de desactivarlos en las versiones de lanzamiento).fuente
Editar: en Xcode 4.2, las afirmaciones están desactivadas de forma predeterminada para las versiones de lanzamiento,
Ahora NSAssert no se compilará en su código en una compilación de lanzamiento , pero puede cambiarlo en la configuración de compilación
@ Mike Weller, hay un error en tu respuesta.
En realidad, NSAssert se compilará en su código si no agrega
NS_BLOCK_ASSERTIONS
sus archivos de prefijo precompilados.En Nota Técnica TN2190 podemos encontrar:
O puede leer este: ¿Cómo saber si NSAssert está deshabilitado en las versiones de versiones?
fuente
En general, las excepciones se utilizan para señalar errores del programador; son cosas que no deberían suceder. Los errores se utilizan para señalar condiciones de error que pueden surgir en el funcionamiento normal del programa: errores de usuario, básicamente, o condiciones externas que deben ser verdaderas pero que pueden no serlo. Por lo tanto, intentar eliminar algún elemento bloqueado en un documento podría ser un error, e intentar descargar un archivo sin una conexión a Internet sería un error, pero intentar acceder a un elemento no válido de una colección sería una excepción.
Las afirmaciones se utilizan normalmente en las pruebas, y AFAIK no se utiliza como un mecanismo general de manejo de errores como los demás.
fuente
NSParameterAssert(someParam != nil);
aplicará el invariante de que el parámetro especificado no debe ser nulo.