我应该如何在Swift中使用NSSetUncaughtExceptionHandler
在Objective-C中,我调用NSSetUncaughtExceptionHandler(&exceptionHandler)
方法来loggingexception。 它如何在Swift中调用?
更新
在Swift 2中,可以将Swift函数和闭包作为C函数指针传递。 请参阅下面的Martin R的答案 。
原始答案
你不能,如Xcode 6testing版6。
Swift确实支持传递函数指针,但是它们看起来很像不透明的指针。 你既不能定义一个Swift函数的C函数指针,也不能在Swift中调用C函数指针。
这意味着你可以从Swift调用NSSetUncaughtExceptionHandler()
,但是处理程序必须在Objective-C中实现。 你需要一个像这样的头文件:
volatile void exceptionHandler(NSException *exception); extern NSUncaughtExceptionHandler *exceptionHandlerPtr;
在实现中,你需要这样的东西:
volatile void exceptionHandler(NSException *exception) { // Do stuff } NSUncaughtExceptionHandler *exceptionHandlerPtr = &exceptionHandler;
在Swift桥接头文件中导入头文件之后,可以照常设置exception处理程序:
NSSetUncaughtExceptionHandler(exceptionHandlerPtr)
从Swift 2(Xcode 7)开始,可以将Swift函数/闭包传递给带有C函数指针的参数。 从Xcode 7发行说明:
对C函数指针的本地支持:可以使用闭包或全局函数来调用带有函数指针参数的C函数,限制条件是闭包不能捕获任何本地上下文。
所以这个编译和工作:
func exceptionHandler(exception : NSException) { print(exception) print(exception.callStackSymbols) } NSSetUncaughtExceptionHandler(exceptionHandler)
或者“内联”closures:
NSSetUncaughtExceptionHandler { exception in print(exception) print(exception.callStackSymbols) }
这与相应的Objective-C代码完全相同:捕获否则未捕获的NSException
。 所以这会被抓住:
let array = NSArray() let elem = array.objectAtIndex(99)
它不捕获任何Swift 2错误(从throw
)或Swift运行时错误,所以这不被捕获:
let arr = [1, 2, 3] let elem = arr[4]