При вызове функции, объявленной с помощью throws
в Swift, вы должны аннотировать сайт вызова функции с помощью try
или try!
. Например, с учетом функции throwing:
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
эту функцию можно вызвать как:
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
Здесь мы аннотируем вызов с помощью try
, который вызывает что эта функция может генерировать исключение, и любые следующие строки кода могут не выполняться. Мы также должны аннотировать эту функцию с помощью throws
, потому что эта функция может генерировать исключение (т. Е. Когда willOnlyThrowIfTrue()
бросает, тогда foo
автоматически восстанавливает исключение вверх.
Если вы хотите вызовите функцию, которая объявлена как возможно бросающая, но которую вы знаете, не будет бросать в ваш случай, потому что вы даете ей правильный ввод, вы можете использовать try!
.
func bar() {
try! willOnlyThrowIfTrue(false)
}
Таким образом, когда вы гарантируете, что код не будет бросать, вам не нужно вводить дополнительный код шаблона, чтобы отключить распространение исключений.
try!
применяется во время выполнения: если вы используете try!
, и функция
Большинство обработок обработки исключений должно выглядеть так: либо вы просто распространяете исключения вверх, когда они происходят, либо вы устанавливаете такие условия, что в противном случае исключаются исключения. Любая очистка других ресурсов вашего кода должна происходить посредством уничтожения объекта (например, deinit()
) или иногда через defer
ed код.
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
Если по какой-либо причине вы очищаете код, который нужно запустить, но не в функции deinit()
, вы можете использовать defer
.
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
Большинство кода, который имеет дело с исключениями, просто передают их вверх вызывающим абонентам, проводя очистку по пути через deinit()
или defer
. Это связано с тем, что большинство кодов не знает, что делать с ошибками; он знает, что пошло не так, но у него недостаточно информации о том, что пытается сделать какой-то код более высокого уровня, чтобы знать, что делать с ошибкой. Он не знает, подходит ли представление пользователю диалога, или если он должен повторить попытку, или если что-то еще подходит.
Однако код более высокого уровня должен точно знать, что делать в случае любой ошибки. Таким образом, исключения допускают появление определенных ошибок, из которых они первоначально возникают, где они могут быть обработаны.
Обработка исключений выполняется с помощью операторов catch
.
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
Вы можете имеют несколько операторов catch, каждый из которых имеет различный вид исключения.
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
Подробнее о передовых методах с исключениями см. в http://exceptionsafecode.com/ . Это специально предназначено для C ++, но после изучения модели исключения Swift я считаю, что основы применимы и к Swift.
Подробнее о модели синтаксиса Swift и обработки ошибок см. В книге The Swift Язык программирования (Swift 2 Prerelease) .
Вы можете использовать свойство dayPropGetter
, чтобы настроить его
Вот как ваша функция должна выглядеть
const customDayPropGetter = (date: Date) => {
if (date.getDate() === 7 || date.getDate() === 6)
return {
className: 'special-day',
style: {
border: 'solid 3px ' + (date.getDate() === 7 ? '#faa' : '#afa'),
},
};
else return {};
};
и назначить функцию следующим образом
dayPropGetter={customDayPropGetter}