Se falhas diferentes exigem ações diferentes, preserve-as com throws ou Result em vez de apagá-las com try?. throws propaga erros durante a chamada; Result guarda sucesso ou falha como valor para tratamento posterior.
Mecanismo e decisão de projeto
ParseError distingue entrada não numérica de número negativo. throws(ParseError) declara o tipo do erro e permite responder com do-catch. try? converte as duas falhas em nil, insuficiente quando as políticas de recuperação diferem. Fonte primária
Código reproduzível
Passe cat, -1, 0 e 42 pelo mesmo parser. Confira que try? produz nil nas duas falhas e guarde os resultados como Result<Int, ParseError>. Um bloco do tipado explicita o tipo capturado; get recupera sucessos ou relança falhas.
Este exemplo independente foi executado em 2026-10-23 com Apple Swift 6.4 para arm64 macOS, no modo de linguagem Swift 6. Não requer rede nem pacotes adicionais.
Baixar o arquivo Swift completo
Execute o comando na pasta do download. As precondições interrompem a execução se uma verificação falhar. Não use -Ounchecked: essa opção remove as verificações.
swift -swift-version 6 swift-error-handling-throws-result.swift
enum ParseError: Error, Equatable { case notInteger, negative }
func parse(_ raw: String) throws(ParseError) -> Int {
guard let value = Int(raw) else { throw .notInteger }
guard value >= 0 else { throw .negative }
return value
}
precondition((try? parse("cat")) == nil && (try? parse("-1")) == nil)
let results: [Result<Int, ParseError>] = ["cat", "-1", "0", "42"].map { raw in
do throws(ParseError) { return .success(try parse(raw)) }
catch { return .failure(error) }
}
precondition(results == [.failure(.notInteger), .failure(.negative), .success(0), .success(42)])
do {
_ = try results[1].get()
preconditionFailure("failure was lost")
} catch ParseError.negative {}
let recovered = try results[3].get()
precondition(recovered == 42)
print("try?-failures=nil,nil result=notInteger,negative,0,42 get-error=negative")
Saída registrada e interpretação
try?-failures=nil,nil result=notInteger,negative,0,42 get-error=negative
O array preserva notInteger, negative, 0 e 42 separadamente. get no resultado de falha lança negative novamente; no sucesso retorna 42. Essa verificação de preservação de informação não precisa de rede nem de E/S de arquivos.
Escopo e limitações
throws não captura toda falha do programa. Traps por desembrulhamento forçado ou precondições violadas ficam fora desse contrato. Uma falha de try! também não é recuperação normal. Apenas parsing síncrono foi executado, não cancelamento assíncrono, retries ou erros de arquivos.
O que verificar em seguida
Defina casos de erro conforme as ações que o chamador distingue. Use Optional para ausência simples, throws para transmitir causas e Result para armazenar ou agregar resultados. Conecte mensagens e logs em uma fronteira que preserve a causa real.
Fontes e verificação
- The Swift Programming Language: Error HandlingSwift.org · Documentação oficial · Consultado 23 de outubro de 2026Evidência: Fonte do contrato de implementação e da explicação. A saída foi verificada separadamente com o experimento incluído aqui.

