2015-07-10 110 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应用程序一样崩溃。 –

相关问题