Вы можете воспользоваться прекомпилятором и написать макрос, который собирает все значения, например:
#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
на селектор, который может (в настоящее время!) Быть приведен к const char).
Однако, если вы хотите это только для исключений Foundation, у вас есть два варианта:
- Обернуть все, что может вызвать исключение в блоках @try () @catch (), а затем создать новый, пользовательский, исключение
- Получите трассировку стека, это может быть немного сложнее, так как ваше приложение находится в несовместимом состоянии и не может собрать все значения.Сбор текущей трассировки стека подробно описан здесь .