Быстрая обработка исключений при закрытии - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть замыкание, определенное следующим образом:

 let processor: (MyBuffer) throws -> MyBuffer { buffer in

    let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

 }

self.processBuffer() выдает исключение, если оно не может вывести допустимый ненулевой буфер.Но компилятор Swift жалуется на тип возвращаемого значения как необязательный.Мой вопрос - погода, единственный верный способ справиться с такой ситуацией - принудительно развернуть опциональное или есть лучший способ справиться с этим?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Используйте try вместо try?.Если processBuffer выбрасывает, то из вашего закрытия будет выброшена неперехваченная ошибка.В противном случае у вас будет действительный outputBuffer для возврата.

let processor: (MyBuffer) throws -> MyBuffer = { buffer in

    let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

}
0 голосов
/ 21 сентября 2018

Принудительное завертывание значений может быть опасным, так как это может привести к сбою приложений.

Делать принудительное перенос, когда вы уверены, что в кадре (100%) опциональное значение будет содержать значение в любой момент времени.

let processor: (MyBuffer) throws -> MyBuffer? { buffer in
     guard let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer) else { return nil }
     return outputBuffer
}

Чтобы вызвать следующее, вы убедитесь, что получаете buffer, что вам нужно, прежде чем его использовать.

guard let buffer = try? processor else { // no buffer was processed, hence you don't proceed the control flow.
    return
}
// you got processed buffer, hence use it.
0 голосов
/ 21 сентября 2018

Вы можете снова сгенерировать исключение или обработать его.

Если вы хотите обработать его, вам нужно заключить код в do-catch, а затем:

 let processor: (MyBuffer) -> MyBuffer{ buffer in

 do{
   let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
   return outputBuffer
}catch HERE_THE_ERROR_TYPE{
 //HERE HOW TO HANDLE THE ERROR
}

}

Более того, выесли вы хотите выдать ошибку:

 let processor: (MyBuffer) throws -> MyBuffer{ buffer in

let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)

return output

 }

Затем вы можете обработать ошибку при вызове закрытия или сбросить ее снова.

Теперь обратите внимание, что если ваша функция выдает ошибку, выможет справиться с опциями, как вы сделали.Это означает, что вы должны обработать или проверить необязательное значение (guard-let, if-let или что вы предпочитаете).Вот почему, если функция processBuffer выдает ошибку, она присвоит outputBuffer значение nil, это означает, что вам не нужно объявление throws:

 let processor: (MyBuffer) -> MyBuffer?{ buffer in

let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
//HERE YOU CAN CHECK IF OUTPUT_BUFFER IS NIL OR NOT
// Otherwise a nil value can be returned
return output

 }

Для получения дополнительной информации проверьте эту документацию: Быстрая обработка ошибок

0 голосов
/ 21 сентября 2018

В этом случае может произойти сбой буфера, и ваш тип возврата говорит, что всегда должен возвращать буфер, вы можете попытаться сделать много вещей, одна из которых изменяет тип возвращаемого значения на -> MyBuffer?.

И когда вы используете processor, вы можете использовать guard let или if let

принудительное развертывание с использованием ! рискованно, как будто в любой момент, если значение было nil, приложение зависало бы

Подробнее о дополнительном сцеплении в документации Swift здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...