Eu não li muito sobre o Swift, mas uma coisa que notei é que não há exceções. Então, como eles lidam com erros no Swift? Alguém encontrou algo relacionado ao tratamento de erros?
swift
error-handling
peko
fonte
fonte
Respostas:
Swift 2 e 3
As coisas mudaram um pouco no Swift 2, pois há um novo mecanismo de tratamento de erros, que é um pouco mais semelhante às exceções, mas diferente em detalhes.
1. Indicando possibilidade de erro
Se a função / método quiser indicar que pode gerar um erro, deve conter uma
throws
palavra-chave como estaNota: não há especificação para o tipo de erro que a função realmente pode gerar. Essa declaração simplesmente declara que a função pode lançar uma instância de qualquer tipo implementando ErrorType ou não está lançando.
2. Chamando a função que pode gerar erros
Para chamar a função, você precisa usar a palavra-chave try, como esta
esta linha normalmente deve estar presente com bloco de captura e captura como este
Nota: a cláusula catch usa todos os recursos avançados da correspondência de padrões Swift, para que você seja muito flexível aqui.
Você pode propagar o erro, se estiver chamando uma função de lançamento de uma função que é marcada com
throws
palavra-chave:Como alternativa, você pode chamar a função de arremesso usando
try?
:Dessa forma, você obtém o valor de retorno ou nulo, se ocorrer algum erro. Usando esse caminho, você não obtém o objeto de erro.
O que significa que você também pode combinar
try?
com declarações úteis como:ou
Por fim, você pode decidir que sabe que o erro não ocorrerá (por exemplo, porque você já verificou os pré-requisitos) e usar a
try!
palavra-chave:Se a função realmente gerar um erro, você receberá um erro de tempo de execução no aplicativo e o aplicativo será encerrado.
3. Lançando um erro
Para gerar um erro, use a palavra-chave throw como esta
Você pode lançar qualquer coisa que esteja em conformidade com o
ErrorType
protocolo. Para iniciantes, emNSError
conformidade com esse protocolo, mas você provavelmente gostaria de usar o enum,ErrorType
que permite agrupar vários erros relacionados, potencialmente com dados adicionais, como esteAs principais diferenças entre o novo mecanismo de erro Swift 2 e 3 e as exceções no estilo Java / C # / C ++ são as seguintes:
do-catch
+try
+defer
vs tradicionaltry-catch-finally
sintaxe .do-catch
bloco não capturará nenhum NSException e vice-versa, para isso você deve usar o ObjC.NSError
convenções do método Cocoa de retornarfalse
(paraBool
retornar funções) ounil
(paraAnyObject
retornar funções) e passarNSErrorPointer
com detalhes de erro.Como um açúcar sintático extra para facilitar o tratamento de erros, existem mais dois conceitos
defer
palavra-chave) que permitem obter o mesmo efeito dos blocos finalmente em Java / C # / etcguard
palavra-chave), que permite escrever um código se / else menos que no código normal de verificação / sinalização de erros.Swift 1
Erros de tempo de execução:
Como Leandros sugere para lidar com erros de tempo de execução (como problemas de conectividade de rede, análise de dados, arquivo de abertura, etc.), você deve usar
NSError
como no ObjC, porque o Foundation, AppKit, UIKit, etc. relatam seus erros dessa maneira. Portanto, é mais uma coisa de estrutura do que de linguagem.Outro padrão frequente que está sendo usado são os blocos de sucesso / falha do separador, como no AFNetworking:
Ainda assim, o bloco de falha recebeu a
NSError
instância frequentemente , descrevendo o erro.Erros do programador:
Para erros do programador (como acesso fora do limite do elemento da matriz, argumentos inválidos passados para uma chamada de função, etc.), você usou exceções no ObjC. Linguagem Swift não parece ter qualquer suporte ao idioma para exceções (como
throw
,catch
, etc palavra-chave). No entanto, como a documentação sugere, ele está sendo executado no mesmo tempo de execução que o ObjC e, portanto, você ainda pode jogarNSExceptions
assim:Você simplesmente não pode capturá-los no Swift puro, embora possa optar por capturar exceções no código ObjC.
A questão é se você deve lançar exceções para erros de programadores ou usar afirmações, como a Apple sugere no guia de idiomas.
fonte
fatalError(...)
é o mesmo também.Atualização 9 de junho de 2015 - Muito importante
Swift 2.0 vem com
try
,throw
ecatch
palavras-chave e o mais interessante é:Trecho de: Apple Inc. “Usando o Swift com cacau e o Objective-C (pré-lançamento do Swift 2).” iBooks.
Exemplo: (do livro)
O equivalente em swift será:
Lançando um erro:
Será propagado automaticamente para o chamador:
Nos livros da Apple, parece que a linguagem de programação Swift parece que os erros devem ser tratados usando enum.
Aqui está um exemplo do livro.
De: Apple Inc. “A linguagem de programação Swift”. iBooks. https://itun.es/br/jEUH0.l
Atualizar
Dos jornais da Apple, "Usando Swift com cacau e Objective-C". As exceções de tempo de execução não ocorrem usando idiomas rápidos, é por isso que você não tem o try-catch. Em vez disso, você usa o encadeamento opcional .
Aqui está um trecho do livro:
Trecho de: Apple Inc. "Usando Swift com cacau e Objective-C". iBooks. https://itun.es/br/1u3-0.l
E os livros também incentivam você a usar o padrão de erro de cacau do Objective-C (NSError Object)
Trecho de: Apple Inc. "Usando Swift com cacau e Objective-C". iBooks. https://itun.es/br/1u3-0.l
fonte
Não há exceções no Swift, semelhante à abordagem do Objective-C.
No desenvolvimento, você pode usar
assert
para capturar os erros que possam aparecer e precisam ser corrigidos antes de ir para a produção.A
NSError
abordagem clássica não é alterada, você envia umNSErrorPointer
, que é preenchido.Breve exemplo:
fonte
f();g();
torna-sef(&err);if(err) return;g(&err);if(err) return;
para o primeiro mês, então ele acaba de se tornarf(nil);g(nil);hopeToGetHereAlive();
O 'Swift Way' recomendado é:
No entanto, prefiro try / catch, pois acho mais fácil seguir porque move o tratamento de erros para um bloco separado no final, esse arranjo às vezes é chamado de "Caminho Dourado". Sorte que você pode fazer isso com fechamentos:
Também é fácil adicionar um recurso de nova tentativa:
A lista para o TryBool é:
Você pode escrever uma classe semelhante para testar um valor retornado opcional em vez de valor bool:
A versão TryOptional aplica um tipo de retorno não opcional que facilita a programação subseqüente, por exemplo, 'Swift Way:
Usando o TryOptional:
Observe o desempacotamento automático.
fonte
Editar: Embora esta resposta funcione, é pouco mais que o Objective-C transliterado para o Swift. Foi tornado obsoleto pelas alterações no Swift 2.0. A resposta de Guilherme Torres Castro acima é uma introdução muito boa à maneira preferida de lidar com erros no Swift. VOS
Demorou um pouco para descobrir isso, mas acho que já o sussurrei. Parece feio embora. Nada além de uma capa fina sobre a versão Objective-C.
Chamando uma função com um parâmetro NSError ...
Escrevendo a função que recebe um parâmetro de erro ...
fonte
Wrapper básico em torno do objetivo C que fornece o recurso try catch. https://github.com/williamFalcon/SwiftTryCatch
Use como:
fonte
Esta é uma resposta de atualização para o Swift 2.0. Estou ansioso por um modelo de manipulação de erros rico em recursos, como em java. Finalmente, eles anunciaram as boas novas. aqui
por exemplo :
fonte
Como Guilherme Torres Castro disse, em Swift 2,0,
try
,catch
,do
pode ser utilizado na programação.Por exemplo, em CoreData buscar método de dados, em vez de colocar
&error
como um parâmetro para omanagedContext.executeFetchRequest(fetchRequest, error: &error)
, agora só precisa usar usomanagedContext.executeFetchRequest(fetchRequest)
e, em seguida, manipular o erro comtry
,catch
( a Apple Document Link )Se você já baixou o xcode7 Beta. Tente pesquisar lançando erros em Documentations and API Reference e escolha o primeiro resultado exibido, pois fornece uma idéia básica do que pode ser feito para essa nova sintaxe. No entanto, a documentação completa ainda não está publicada para muitas APIs.
Técnicas mais sofisticadas de tratamento de erros podem ser encontradas em
fonte
A manipulação de erros é um novo recurso do Swift 2.0. Ele usa os
try
,throw
ecatch
palavras-chave.Veja o anúncio do Apple Swift 2.0 no blog oficial do Apple Swift
fonte
Lib agradável e simples para lidar com a exceção: TryCatchFinally-Swift
Como alguns outros, ele envolve os recursos de exceção do objetivo C.
Use-o assim:
fonte
Começando com o Swift 2, como outros já mencionaram, a manipulação de erros é melhor realizada através do uso de enums do / try / catch e ErrorType. Isso funciona muito bem para métodos síncronos, mas é necessária um pouco de inteligência para o tratamento de erros assíncronos.
Este artigo possui uma ótima abordagem para esse problema:
https://jeremywsherman.com/blog/2015/06/17/using-swift-throws-with-completion-callbacks/
Para resumir:
então, a chamada para o método acima seria a seguinte:
Isso parece um pouco mais limpo do que ter um retorno de chamada errorHandler separado passado para a função assíncrona, que era como isso seria tratado antes do Swift 2.
fonte
O que eu vi é que, devido à natureza do dispositivo, você não deseja lançar um monte de mensagens enigmáticas de manipulação de erros para o usuário. É por isso que a maioria das funções retorna valores opcionais, então você apenas codifica para ignorar o opcional. Se uma função retornar nula, significando que falhou, você poderá exibir uma mensagem ou o que for.
fonte