NSSetUncaughtExceptionHandler没有在Swift 3中触发?

时间:2016-09-04 04:55:47

标签: swift cocoa error-handling

我正试图在Swift3程序中捕获所有NSExceptions - 一直关注this Stack Overflow answer

所以我得到了这个:

import play.api.libs.json.Json
import play.api.libs.json.JsObject


case class Item (id:Long,name:String,price:Double) 
object SerializingListIntoJSON {

  def details(itemList: Seq[Item]) = {
    **Json.arr(itemList.map(item => Json.obj("id" -> item.id,"name" -> item.name,"price" -> item.price)): _*)**
  }

  def main(args: Array[String]): Unit = {
    val itemList = Seq(Item(1, "Programming Scala", 49.99), Item(2, "Scala in Action", 44.99))

    println(details(itemList))
  }
}

但是没有调用异常 相反,我得到了这个输出:

  

2016-09-04 14:49:14.252 catchAllErrorsTest [8126:164827]设置失败   (contentViewController)用户定义的检查属性(NSWindow):   *** - [__ NSArray0 objectAtIndex:]:索引99超出空NSArray的界限

我也尝试将异常放入AppDelegate(在applicationWillFinishLaunching和applicationDidFinishLaunching中),但结果相同

1 个答案:

答案 0 :(得分:0)

我做了如下操作,并在Swift 3中为我工作。 将您的NSSetUncaughtExceptionHandler定义为AppDelegate中任何方法声明之外的常量:

let uncaughtExceptionHandler : Void = NSSetUncaughtExceptionHandler { exception in
NSLog("Name:" + exception.name.rawValue)
if exception.reason == nil
    {
        NSLog("Reason: nil")
    }
    else
    {
        NSLog("Reason:" + exception.reason!)
    }

}

这会在任何未捕获的异常触发,因为只要App Delegate实例加载(即在应用程序启动时),就会评估此常量。 注意:Void类型声明删除了Void推断类型的编译器警告,该类型可能是意外的" ;-)。