Quero fazer algo no Swift 2 que estou acostumado a fazer em vários outros idiomas: lançar uma exceção de tempo de execução com uma mensagem personalizada. Por exemplo (em Java):
throw new RuntimeException("A custom message here")
Entendo que posso lançar tipos de enumerações que estejam em conformidade com o protocolo ErrorType, mas não quero definir enumerações para todos os tipos de erros lançados. Idealmente, eu gostaria de imitar o exemplo acima o mais próximo possível. Procurei criar uma classe personalizada que implementa o protocolo ErrorType, mas não consigo nem descobrir o que esse protocolo exige (consulte a documentação ). Ideias?
Respostas:
A abordagem mais simples é provavelmente definir um costume
enum
com apenas umcase
que tenha umString
anexo:Ou, como no Swift 4:
Exemplo de uso seria algo como:
Se você deseja usar
Error
tipos existentes , o mais geral seria umNSError
e você pode criar um método de fábrica para criar e lançar um com uma mensagem personalizada.fonte
String
internaserrorMessage
, se sim, como faço isso?String
está associado aqui com oMyError.RuntimeError
(definido no momento dethrow
) e você obtém acesso a ele nocatch
(comlet errorMessage
).try!
, o que não é usado aqui. Você realmente não pode nem fazer a chamada potencialmente lançada sem algum tipo detry
. (Também a parte do código é o uso de exemplo, e não a solução real.)A maneira mais simples é fazer a
String
conformidade comError
:Então você pode simplesmente jogar uma string:
Para tornar a própria string
localizedString
o erro, você pode estenderLocalizedError
:fonte
localizedDescription
seja a própria string?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
depois de lançar uma string.A solução do @ nick-keets é mais elegante, mas foi quebrada para mim no destino de teste com o seguinte erro de tempo de compilação:
Redundant conformance of 'String' to protocol 'Error'
Aqui está outra abordagem:
E para usar:
fonte
Confira esta versão legal. A idéia é implementar os protocolos String e ErrorType e usar o rawValue do erro.
Uso:
fonte
as User.UserValidationError
e acima disso o.rawValue
. No entanto, se você implementouCustomStringConvertible
comovar description: String { return rawValue }
, pode ser útil obter as descrições personalizadas usando a sintaxe da enum sem precisar passar porrawValue
todos os locais em que você a imprime.Swift 4:
Conforme:
https://developer.apple.com/documentation/foundation/nserror
se você não quiser definir uma exceção personalizada, poderá usar um objeto NSError padrão da seguinte maneira:
Impressões:
Isso permite que você forneça uma sequência personalizada, além de um código numérico e um dicionário com todos os dados adicionais necessários, de qualquer tipo.
Nota: foi testado no SO = Linux (Ubuntu 16.04 LTS).
fonte
Solução mais simples, sem extensões extras, enumerações, classes e etc .:
fonte
raise()
vez dethrow
) que é difícil de lembrar. Compare sua solução comthrow Foo.Bar("baz")
outhrow "foo"
multiplique pelo número de lugares em que uma exceção é lançada - na IMO, a taxa única de extensão ou enum de uma linha é muito preferível a coisas assimNSExceptionName
.postNotification
requer 2-3 parâmetros e seu seletor é semelhante a este. Você substituiNotification
e / ouNotificationCenter
em cada projeto para permitir que ele aceite menos parâmetros de entrada?String
para se conformarError
é muito surpreendente ou se umMyError
enum é muito vago (pessoalmente, eu responderia sim a ambos e, em vez disso, faria um caso enum separado para cada erro, ou seja,throw ThisTypeOfError.thisParticularCase
)Com base na resposta de @Nick keets, aqui está um exemplo mais completo:
Publicado originalmente no meu blog rápido: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
fonte
throw NSError(message: "err", code: 0)
domain
, nãomessage
, certo?Caso você não precise capturar o erro e queira parar imediatamente o aplicativo, você pode usar um fatalError:
fatalError ("Custom message here")
fonte
Gosto da resposta de @ Alexander-Borisenko, mas a descrição localizada não foi retornada quando detectada como um erro. Parece que você precisa usar LocalizedError:
Veja esta resposta para mais detalhes.
fonte