【问题标题】:NSSetUncaughtExceptionHandler not firing in Swift 3?NSSetUncaughtExceptionHandler 没有在 Swift 3 中触发?
【发布时间】:2017-01-11 19:48:09
【问题描述】:

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

所以我有这个:

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 catchAllErrorsTest[8126:164827] 设置失败 (contentViewController) 用户在 (NSWindow) 上定义的检查属性: *** -[__NSArray0 objectAtIndex:]:空 NSArray 的索引 99 超出范围

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

【问题讨论】:

  • 您分享的链接明确指出它没有捕获任何 Swift 2 错误(from throw) 或 Swift 运行时错误,例如访问数组的第 99 个索引[1, 2, 3]
  • 感谢@ozgur - 我同意链接声明它不会捕获 Swift 错误,但它似乎清楚地表明引用的代码将起作用(它说'所以这将被捕获:') -而且看起来我应该抛出一个 NSException (尽管我不是专家)

标签: swift cocoa error-handling


【解决方案1】:

我按照以下方式在 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 推断类型的编译器警告;-)。

【讨论】:

  • 但是它对我不起作用-我创建了一个新的 Swift 3 项目-我将您的代码放在 AppDelegate.swift 中-在任何方法之外(直接在“import cocoa”下方。然后在跨度>
  • ... 啊... 对不起... 然后在 viewDidLoad 中,在 super.viewDidLoad 之后,我放了相同的代码来强制错误( // force NSException let array = NSArray() _ = array.object(at: 99))
  • 我得到了“2016-10-16 20:16:45.345 testUncaughtException[3408:163505] 无法在 (NSWindow) 上设置 (contentViewController) 用户定义的检查属性:*** -[__NSArray0 objectAtIndex :]: 索引 99 超出了空 NSArray"的界限"
  • 但未调用 uncaughtExceptionHandler
  • @JonCook 你找到解决这个问题的方法了吗?我也面临同样的行为。
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2017-01-11
相关资源
最近更新 更多