NSSetUncaughtExceptionHandler未在Swift 3中开火?

NSSetUncaughtExceptionHandler未在Swift 3中开火?,swift,cocoa,error-handling,Swift,Cocoa,Error Handling,我正在尝试捕捉Swift3程序中的所有NSException-一直在跟踪 所以我有这个: override func viewDidLoad() { super.viewDidLoad() NSSetUncaughtExceptionHandler { exception in print("EXCEPTION CAUGHT HERE....") print(exception) print(exception.callStackS

我正在尝试捕捉Swift3程序中的所有NSException-一直在跟踪

所以我有这个:

override func viewDidLoad() {
    super.viewDidLoad()
    NSSetUncaughtExceptionHandler { exception in
        print("EXCEPTION CAUGHT HERE....")
        print(exception)
        print(exception.callStackSymbols)
    }

    // force NSException
    let array = NSArray()
    _ = array.object(at: 99)

}
但是没有调用异常 相反,我得到以下输出:

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


我还尝试将异常放入AppDelegate(在applicationWillFinishLaunching和ApplicationIDFinishLaunching中),但相同的结果是,我做了如下操作,并在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!)
    }

}
这会在任何未捕获的异常时触发,因为一旦加载应用程序委托实例,即在应用程序启动时,就会计算该常量。
注意:Void类型声明删除了针对Void推断类型的编译器警告,该类型“可能是意外的”;-)

您共享的链接明确声明它不会捕获任何Swift 2错误
(来自throw)
或Swift运行时错误,例如访问数组的第99个索引
[1,2,3]
。感谢@ozgur-我同意该链接声明它不会捕获Swift错误,但它似乎明确声明引用的代码将起作用(上面写着‘这将被捕获’)-当然看起来我应该抛出一个NSException(尽管我不是专家),但是它对我不起作用-我创建了一个新的Swift 3项目-我将您的代码放在AppDelegate.Swift中-在任何方法之外(直接在“导入cocoa”下面)。然后在…argh…抱歉…然后在viewDidLoad中,在super.viewDidLoad之后,我使用相同的代码强制执行错误(//force NSException let array=NSArray()=array.object(at:99))并得到“2016-10-16 20:16:45.345 testUncaughtException[3408:163505]未能在上设置(contentViewController)用户定义的已检查属性”(NSWindow):***-[\uuu NSArray0 objectAtIndex:]:索引99超出空NSArray的界限”,但未捕获uncaughtExceptionHandlercalled@JonCook你找到解决这个问题的办法了吗?我也面临着同样的行为。