Вы можете сделать что-то очень похожее с блоками:
typedef void(^WrappableBlock)(void);
^(WrappableBlock block) {
@try {
block();
}
@catch(...)
}
//handle exception
}
}
Однако очень важно понимать, что библиотеки Cocoa (и CocoaTouch) не безопасны для исключений.Создание исключения через платформы Какао приведет к всевозможным проблемам, так как платформы не будут должным образом обрабатывать или очищать от исключений, оставляя ваше приложение в возможно несовместимом состоянии.Правильный стиль Какао должен использовать NSError
и возвращать флаги, чтобы указать условия ошибки.Это не лучше и не хуже, чем использование исключений, просто другая философия.
Сделать что-то похожее на universal_handling
с NSError
не так уж и просто, потому что для этого потребуется, чтобы все, что вы называете, соответствовалоNSError
шаблон.Тем не менее:
typedef BOOL(^WrappableBlock)(NSError**);
^(WrappableBlock block, NSError **err) {
BOOL success = block(err);
if(!success) {
// handle error
}
return success;
}
обернет любой метод, который принимает просто NSError**
и возвращает BOOL
, чтобы указать наличие ошибки.Очевидно, что полезность этой обертки ограничена, так как вам придется обернуть любой интересный метод в другой блок для обработки любых других параметров.Конечно, поскольку это шаблон NSError**
, вы всегда можете просто обработать ошибки, когда / где вы захотите, и передать NULL
в качестве параметра NSError**
, где вам все равно (игнорируя возвращаемое значение).
Последнее замечание: если вы используете библиотеки, которые могут генерировать исключения, вы должны перехватить эти исключения в рамках вызова библиотеки и обработать их.Не позволяйте исключениям распространяться, поскольку они могут затем распространяться через код структуры Какао.Таким образом, полезность предлагаемого вами блока universal_handling
ограничена.