Existem dois pontos importantes no modelo de tratamento de erros do Swift 2: exaustividade e resiliência. Juntos, eles se resumem à sua declaração do
/ catch
, precisando detectar todos os erros possíveis, não apenas aqueles que você sabe que pode lançar.
Observe que você não declara quais tipos de erros uma função pode gerar, apenas se ela gera. É um problema do tipo zero-um-infinito: como alguém que define uma função para os outros (incluindo o seu futuro eu), você não precisa fazer com que cada cliente da sua função se adapte a todas as mudanças na implementação do seu função, incluindo quais erros ela pode gerar. Você deseja que o código que chama sua função seja resistente a essa alteração.
Como sua função não pode dizer que tipo de erros ela gera (ou pode gerar no futuro), os catch
blocos que os capturam não sabem que tipos de erros podem ser lançados. Portanto, além de lidar com os tipos de erro que você conhece, você precisa lidar com os que não conhece com uma catch
instrução universal - dessa forma, se sua função alterar o conjunto de erros que ela lança no futuro, os chamadores ainda perceberão seu problema. erros.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch let error {
print(error.localizedDescription)
}
Mas não vamos parar por aí. Pense mais nessa idéia de resiliência. Do jeito que você projetou seu sanduíche, você deve descrever os erros em todos os lugares em que os usar. Isso significa que sempre que você altera o conjunto de casos de erro, é necessário alterar todos os locais que os usam ... não é muito divertido.
A idéia por trás da definição de seus próprios tipos de erro é permitir que você centralize coisas assim. Você pode definir um description
método para seus erros:
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
E então seu código de tratamento de erros pode solicitar que seu tipo de erro se descreva - agora todos os lugares em que você lida com erros podem usar o mesmo código e também com possíveis casos de erros futuros.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
Isso também abre caminho para os tipos de erro (ou extensões neles) oferecerem suporte a outras formas de relatar erros - por exemplo, você pode ter uma extensão no seu tipo de erro que saiba como apresentar um UIAlertController
para relatar o erro a um usuário do iOS.