NSSetUncaughtExceptionHandler只捕获Objective-C异常。我只需要捕获快速异常。有可能吗?
NSSetUncaughtExceptionHandler捕捉到了这一条。设arr = NSArray()设x= arr4
我也想捕捉到这次崩溃。let number: Int?= nil let val = number!
发布于 2021-02-24 16:15:16
正如我在上面的评论中所提到的
Swift不处理异常,它处理错误,因此当你使用swift for let x = arr[4]的try catch块时,你不能捕获异常(它的数组越界异常不是一个错误)。
正如Vadian还指出的那样,Swift鼓励您捕获并解决这些异常,而不是在运行时捕获它们。
也就是说,在某些情况下,您可能需要显式地处理异常,例如,您正在处理用Objective-C编写的第三方框架并可能抛出异常,或者您可能正在处理某些仍然运行在Objective-C运行时并抛出异常的iOS应用程序接口,在这种情况下,在objective C中有一个自己的have方法并使用块/闭包将快速语句传递给它并在Objective-C try catch块中执行它们是很方便的,
你怎么做?
ExceptionCatcher.h
#import <Foundation/Foundation.h>
@interface ExceptionCatcher : NSObject
+ (void)catchExceptionIfAny: (void(^)(void)) executeCodeBlock withCompletion: (void (^)(NSException *)) completion;
@endExceptionCatcher.m
#import <Foundation/Foundation.h>
#import "ExceptionCatcher.h"
@implementation ExceptionCatcher : NSObject
+ (void)catchExceptionIfAny: (void(^)(void)) executeCodeBlock withCompletion: (void (^)(NSException *)) completion {
@try {
executeCodeBlock();
}
@catch (NSException *exception) {
NSLog(@"%@", exception.description);
completion(exception);
}
}
@end最后,使用以下命令更新桥接头文件
#import "ExceptionCatcher.h"并转到swift文件,并将其用作
let x = NSArray()
ExceptionCatcher.catchExceptionIfAny({[weak self] in
let a = x[4]
debugPrint(a)
}) { (exception) in
if let e = exception {
debugPrint(e.description)
}
}上面的代码之所以有效,是因为x被声明为NSArray,它是从NSObject扩展而来的,如果你使用x = [1,2,3],你将创建一个Swift数组的实例,显然swift数组不会抛出异常。所以当你使用这个方法时要非常小心。
这不是为了捕获所有类型的Exceptions而做的工作,应该谨慎使用(仅在不可能避免的情况下)这是一种过度的杀伤力,对于这种用例是不必要的。
https://stackoverflow.com/questions/66346312
复制相似问题