NSKeyedUnarchiver - try / catch needed?
Pelo que entendi, o uso de@try/@catch
blocos é desencorajado, porqueexceptions
só deve ser lançada em erros catastróficos irrecuperáveis (consulte esta discussão com uma boa resposta@bbum: Handelação de exceção no iOS).
Então eu olhei pelo meu código e encontrei um@try/@catch
bloco que eu não sei como me livrar de:
NSData *fileData = [NSData dataWithContentsOfFile: ....];
NSDictionary *dictionary;
@try {
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData];
}
@catch (NSException *exception) {
//....
}
@finally {
//...
}
O problema é que (como afirmado nodocumentação) +unarchiveObjectWithData:
levanta umNSInvalidArchiveOperationException
se oNSData
não contém um arquivo válido.
Como os dados são fornecidos por um arquivo escolhido pelo usuário, não é garantido que ele contenha um archive válido e, portanto, o aplicativo falharia se um arquivo incorreto fosse escolhido.
Agora duas perguntas:
Por que não+unarchiveObjectWithData:
apenas retornenil
(Editar: e umNSError**
) se o arquivo não for válido (isso não parece se qualificar como um erro catastrófico ou irrecuperável).O padrão acima está correto?@try
) Eu não encontrei nenhum método que nos permite verificar se os dados contêm um arquivo válido de antemão e não encontraram nenhuma possibilidade para lidar com este caso usando o protocolo delegado. Antyhing eu esqueci?Note que o código acima funciona, claro, eu só me pergunto se é a melhor prática.