Swift e Objective-C

throws e Result em Swift: preserve a causa da falha

Compare erros convertidos em nil por try? com typed throws e resultados armazenados; use get para recuperar valores ou lançar novamente uma falha.

2 min de leitura
Imagem de capa de throws e Result em Swift: preserve a causa da falha

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.

Experimento relacionado

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.