2015-07-10 54 views
6

我想使用Swift 2.0 try-catch。swift可以捕獲致命錯誤?

我本來下面的代碼

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

但procdues錯誤

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

    return open; 
} 

所以我在viewDidLoad中(改代碼):

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

但它確實不行 !!!

我猜swift的try-catch與C,C#中的不同。

我該如何捕捉致命錯誤?

可能下面是一個適當的快捷方式?

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

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

只是閱讀所有這些:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html –

回答

0

當你調用Hi()這樣的:open!.Hi();,你的程序可能會崩潰,如果open是零。

open是一個參數,作爲該參數傳遞的值在呼叫站點上定義爲:var obj : Object?;。您正在定義一個名爲obj的新變量,其類型爲Object?,但您並未指定它的值。這意味着obj將爲零,因此open將爲零,並導致open!.Hi()崩潰。

要解決這個問題,請確保爲參數Hi分配一個值。將參數設置爲非可選參數可能會更好,因此您無需強制解包即可調用該參數。

9

你不應該趕上fatalerror。它表示編程錯誤。你不會發現編程錯誤,你修復你的代碼。這次事故是故意的,而且你無法阻止它是故意的。

Swift 2提供了一些涉及關鍵字try,catch和throw的東西,但這不像你似乎正在考慮的C++異常。

+1

這真是太遺憾了!謝謝你的回答^^ a – AquaMinDlRae

+0

「沒有什麼比C++異常」?我...除此之外。這是幾乎相同的想法,對吧? –

+4

「你不會發現編程錯誤,你修復你的代碼。」是非常糟糕的,在1000多名用戶的野外應用程序有很多代碼和數據的排列組合,您無法事先預見和測試所有代碼和數據。目前,我們必須使用Objective-C,以便您可以捕獲異常,將它們記錄下來並讓應用程序優雅地失敗,而不是像Swift應用程序一樣崩潰。 –

相關問題