swift可以捕获致命错误?

AKi*_*Uea 9 try-catch fatal-error ios swift

我正在尝试使用Swift 2.0 try-catch.

我原来有以下代码

override func viewDidLoad()
{
    var obj : Object?;
    Hi( obj );
}
Run Code Online (Sandbox Code Playgroud)

但它会产生错误

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

    return open;
}
Run Code Online (Sandbox Code Playgroud)

因此我将viewDidLoad()中的代码更改为:

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

但它不起作用!

我猜swift的try-catch与C,C#不同.

我怎样才能发现致命错误?

以下可能是一个适当的快速方式?

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

        return open;
    }
    else
    {
        return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

gna*_*729 8

你不应该抓住fatalerror.它表示编程错误.您没有发现编程错误,修复了代码.崩溃是故意的,你故意不能阻止它.

涉及关键字try,catch和throw的东西在Swift 2中可用,但这与您似乎正在考虑的C++异常完全不同.

  • "你没有发现编程错误,你修复了你的代码." 很糟糕的是,1000个用户在野外的应用程序有很多代码和数据的排列,你无法提前预测和测试.目前我们必须使用Objective-C,这样您就可以捕获异常,记录它们并让应用程序正常失败,而不是像Swift应用程序一样崩溃. (9认同)
  • 在很多情况下,捕获致命错误是完全合理的。例如:解码从服务器接收到的复杂二进制数据,其中可能存在大量索引超出范围错误。手动检查它们会使代码更难阅读。 (3认同)

小智 -2

Hi()当您像这样调用: 时,如果为零,open!.Hi();您的程序可能会崩溃。open

open是一个参数,作为该参数传递的值在调用站点上定义如下:var obj : Object?;。您正在定义一个名为objtype 的新变量Object?,但没有为其分配值。这意味着obj将为零,因此open将为零,这会导致open!.Hi()崩溃。

要解决这个问题,请确保为 的参数赋值Hi。最好也将参数设置为非可选,这样您就不必强制解开它来调用其上的函数。