2015-07-10 10 views
6

Sto cercando di utilizzare il try-catch di Swift 2.0.rapido può rilevare errori fatali?

Originariamente ho avuto il seguente codice

override func viewDidLoad() 
{ 
    var obj : Object?; 
    Hi(obj); 
} 

Ma procdues un errore

func Hi(open : Open?) -> Open? 
{ 
    open!.Hi(); <-- here is error point. Fatal error ! 
    print("OK"); 

    return open; 
} 

quindi ho cambiato il codice in viewDidLoad() a:

override func viewDidLoad() 
{ 
    try 
    { 
     var obj : Object?; 
     Hi(obj); 
    } 
    catch 
    { 
     print("bug !!!"); <- I want to this !!! 
    } 
} 

ma lo fa non funziona !!!

Immagino che il try-catch di swift sia diverso da C, C#.

Come posso rilevare l'errore fatale?

Potrebbe essere il modo corretto per seguire?

func Hi(open : Open?) -> Open? 
{ 
    if let op = open 
    { 
     op.Hi(); 
     print("OK"); 

     return open; 
    } 
    else 
    { 
     return nil; 
    } 
} 
+2

Basta leggere tutto questo: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html –

risposta

0

Quando si sta chiamando Hi() in questo modo: open!.Hi();, il programma può bloccarsi se open è pari a zero.

open è un parametro e il valore che viene passato come tale parametro viene definito nel sito di chiamata come tale: var obj : Object?;. Stai definendo una nuova variabile denominata obj con tipo Object?, ma non stai assegnando un valore. Ciò significa che obj sarà nullo e quindi open sarà nullo e questo porta a open!.Hi() arresto anomalo.

Per risolvere il problema, assicurarsi di assegnare un valore al parametro Hi. Potrebbe essere preferibile rendere il parametro non facoltativo, quindi non devi forzarlo a scartarlo per richiamare una funzione su di esso.

9

Non si dovrebbe catturare fatalerror. Indica un errore di programmazione. Non rilevi errori di programmazione, correggi il tuo codice. Lo schianto è intenzionale ed è intenzionale che non puoi fermarlo.

Qualcosa che coinvolge le parole chiave try, catch e throw è disponibile in Swift 2, ma non si tratta di eccezioni C++ a cui sembra che tu stia pensando.

+1

È un peccato! Grazie la tua risposta ^^ a – AquaMinDlRae

+0

"Niente come eccezioni C++"? Io ... faccio eccezione a questo. È praticamente la stessa idea, giusto? –

+4

"Non rilevi errori di programmazione, correggi il tuo codice." è terribile, le app in circolazione con migliaia di utenti hanno molte permutazioni di codice e dati che non puoi prevedere e testare tutte in anticipo. Per ora dobbiamo usare Objective-C in modo da poter rilevare le eccezioni, registrarle e lasciare che l'app fallisca con grazia invece di bloccarsi come un'app Swift. –

Problemi correlati