Después de instalar Xcode 7 beta y convertir mi código swift a Swift 2, tuve un problema con el código que no puedo entender. Sé que Swift 2 es nuevo, así que busco y descubro que no hay nada al respecto, debería escribir una pregunta.
Aquí está el error:
La llamada se puede lanzar, pero no está marcada con 'intentar' y el error no se maneja
Código:
func deleteAccountDetail(){
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
//The Line Below is where i expect the error
let fetchedEntities = self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
do {
try self.Context!.save()
} catch _ {
}
}
Instantánea:
try
palabra clave a la llamada de función y declarar esta función comofunc deleteAccountDetail() throw
. O si ha garantizado que la función no arrojará la entrada dada, puede usarlatry!
.deinit()
llamadas implícitas para hacer la limpieza (es decir, RAII), o en ocasiones usardefer
para hacer una limpieza ad hoc. Consulte exceptionsafecode.com para obtener más información (habla de C ++, pero los principios básicos también se aplican a las excepciones de Swift).Al llamar a una función que se declara con
throws
en Swift, debe anotar el sitio de llamada de función contry
otry!
. Por ejemplo, dada una función de lanzamiento:Esta función se puede llamar así:
Aquí anotamos la llamada con
try
, lo que indica al lector que esta función puede generar una excepción y que las siguientes líneas de código podrían no ejecutarse. También tenemos que anotar esta función conthrows
, porque esta función podría lanzar una excepción (es decir, cuando sewillOnlyThrowIfTrue()
lanza,foo
automáticamente volverá a lanzar la excepción hacia arriba).Si desea llamar a una función que se declara como posiblemente lanzada, pero que sabe que no se lanzará en su caso porque le está dando la entrada correcta, puede usarla
try!
.De esta manera, cuando garantiza que el código no se lanzará, no tiene que poner código extra repetitivo para deshabilitar la propagación de excepciones.
try!
se aplica en tiempo de ejecución: si usatry!
y la función termina lanzando, la ejecución de su programa terminará con un error de tiempo de ejecución.La mayoría de los códigos de manejo de excepciones deben ser similares a los anteriores: o simplemente propaga las excepciones hacia arriba cuando ocurren, o configura las condiciones de modo que, de lo contrario, se descarten posibles excepciones. Cualquier limpieza de otros recursos en su código debe ocurrir a través de la destrucción de objetos (es decir
deinit()
), o algunas veces a través deldefer
código ed.Si por alguna razón tiene un código de limpieza que necesita ejecutarse pero no está en una
deinit()
función, puede usarlodefer
.La mayoría del código que trata con excepciones simplemente hace que se propaguen hacia arriba a las personas que llaman, haciendo la limpieza en el camino a través de
deinit()
odefer
. Esto se debe a que la mayoría del código no sabe qué hacer con los errores; sabe qué salió mal, pero no tiene suficiente información sobre lo que intenta hacer un código de nivel superior para saber qué hacer con el error. No sabe si presentar un diálogo al usuario es apropiado, o si debería volver a intentarlo, o si algo más es apropiado.Sin embargo, el código de nivel superior debe saber exactamente qué hacer en caso de error. Por lo tanto, las excepciones permiten que surjan errores específicos desde donde ocurren inicialmente hasta donde se pueden manejar.
El manejo de excepciones se realiza mediante
catch
declaraciones.Puede tener varias declaraciones catch, cada una de las cuales captura un tipo diferente de excepción.
Para obtener más detalles sobre las mejores prácticas con excepciones, consulte http://exceptionsafecode.com/ . Está específicamente dirigido a C ++, pero después de examinar el modelo de excepción Swift, creo que los conceptos básicos se aplican también a Swift.
Para obtener detalles sobre el modelo de sintaxis y manejo de errores de Swift, consulte el libro El lenguaje de programación Swift (Presentación preliminar de Swift 2) .
fuente
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
NSData?, NSURLResponse?, NSError?
como argumentos, pero le está dando una función que no toma ningún argumento.