您可以利用预编译器并编写一个收集所有值的宏,例如:
#define __ThrowException(name, reason, class, function, file, line, info) [NSException exceptionWithName:name reason:[NSString stringWithFormat:@"%s:%i (%@:%s) %@", file, line, class, function, reason] userInfo:info];
#define ThrowException(name, reason, info) __ThrowException(name, reason, [self class], _cmd, __FILE__, __LINE__, info)
但是,这仅在您抛出异常并从 ObjC 函数内部(self 和_cmd
是您在 ObjC 函数中获得的第一个参数,其中 self 是指向类和_cmd
选择器的 id 可以是(当前!) 类型转换为 const char)。
但是,如果您只希望 Foundation 异常使用此功能,您有两种选择:
- 在 @try() @catch() 块中包装可能引发异常的所有内容,然后引发新的自定义异常
- 获取堆栈跟踪,这可能有点困难,因为您的应用程序可能处于不一致的状态并且无法收集所有值。此处详细介绍了收集当前堆栈跟踪。