mar*_*314 125 ios swift swift2
我想在Swift 2中做一些我以前用其他多种语言做的事情:用自定义消息抛出运行时异常.例如(在Java中):
throw new RuntimeException("A custom message here")
Run Code Online (Sandbox Code Playgroud)
我知道我可以抛出符合ErrorType协议的枚举类型,但我不想为我抛出的每种类型的错误定义枚举.理想情况下,我希望能够尽可能地模仿上面的例子.我研究了创建一个实现ErrorType协议的自定义类,但我甚至无法弄清楚该协议需要什么(参见文档).想法?
Ark*_*kku 174
最简单的方法可能是定义一个定制的enum只有一个case是有一个String连接到它:
enum MyError: ErrorType {
case runtimeError(String)
}
Run Code Online (Sandbox Code Playgroud)
或者,从Swift 4开始:
enum MyError: Error {
case runtimeError(String)
}
Run Code Online (Sandbox Code Playgroud)
示例用法如下:
func someFunction() throws {
throw MyError.runtimeError("some message")
}
do {
try someFunction()
} catch MyError.runtimeError(let errorMessage) {
print(errorMessage)
}
Run Code Online (Sandbox Code Playgroud)
如果您希望使用现有Error类型,那么最常用的类型就是a NSError,您可以创建一个工厂方法来创建一个带有自定义消息的方法.
Nic*_*ets 123
最简单的方法是String遵守Error:
extension String: Error {}
Run Code Online (Sandbox Code Playgroud)
然后你可以抛出一个字符串:
throw "Some Error"
Run Code Online (Sandbox Code Playgroud)
要使字符串本身成为localizedString错误,您可以改为LocalizedError:
extension String: LocalizedError {
public var errorDescription: String? { return self }
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*nko 19
@ nick-keets的解决方案是最优雅的,但它在测试目标中为我打破了以下编译时错误:
Redundant conformance of 'String' to protocol 'Error'
这是另一种方法:
struct RuntimeError: Error {
let message: String
init(_ message: String) {
self.message = message
}
public var localizedDescription: String {
return message
}
}
Run Code Online (Sandbox Code Playgroud)
并使用:
throw RuntimeError("Error message.")
Run Code Online (Sandbox Code Playgroud)
Teo*_*aru 18
检查这个很酷的版本.我们的想法是实现String和ErrorType协议并使用错误的rawValue.
enum UserValidationError: String, Error {
case noFirstNameProvided = "Please insert your first name."
case noLastNameProvided = "Please insert your last name."
case noAgeProvided = "Please insert your age."
case noEmailProvided = "Please insert your email."
}
Run Code Online (Sandbox Code Playgroud)
用法:
do {
try User.define(firstName,
lastName: lastName,
age: age,
email: email,
gender: gender,
location: location,
phone: phone)
}
catch let error as User.UserValidationError {
print(error.rawValue)
return
}
Run Code Online (Sandbox Code Playgroud)
PJ_*_*gan 14
斯威夫特4:
按照:
https://developer.apple.com/documentation/foundation/nserror
如果您不想定义自定义异常,可以使用标准NSError对象,如下所示:
import Foundation
do {
throw NSError(domain: "my error description", code: 42, userInfo: ["ui1":12, "ui2":"val2"] )
}
catch let error as NSError {
print("Caught NSError: \(error.localizedDescription), \(error.domain), \(error.code)")
let uis = error.userInfo
print("\tUser info:")
for (key,value) in uis {
print("\t\tkey=\(key), value=\(value)")
}
}
Run Code Online (Sandbox Code Playgroud)
打印:
Caught NSError: The operation could not be completed, my error description, 42
User info:
key=ui1, value=12
key=ui2, value=val2
Run Code Online (Sandbox Code Playgroud)
这允许您提供自定义字符串,以及包含任何类型所需的所有其他数据的数字代码和字典.
注意:这是在OS = Linux(Ubuntu 16.04 LTS)上测试的.
如果您不需要捕获错误并且想立即停止应用程序,您可以使用致命错误:
fatalError ("Custom message here")
没有额外扩展,枚举,类等的最简单解决方案:
NSException(name:NSExceptionName(rawValue: "name"), reason:"reason", userInfo:nil).raise()
Run Code Online (Sandbox Code Playgroud)
基于@Nick keets的答案,这是一个更完整的示例:
extension String: Error {} // Enables you to throw a string
extension String: LocalizedError { // Adds error.localizedDescription to Error instances
public var errorDescription: String? { return self }
}
func test(color: NSColor) throws{
if color == .red {
throw "I don't like red"
}else if color == .green {
throw "I'm not into green"
}else {
throw "I like all other colors"
}
}
do {
try test(color: .green)
} catch let error where error.localizedDescription == "I don't like red"{
Swift.print ("Error: \(error)") // "I don't like red"
}catch let error {
Swift.print ("Other cases: Error: \(error.localizedDescription)") // I like all other colors
}
Run Code Online (Sandbox Code Playgroud)
最初发布在我的快速博客上:http : //eon.codes/blog/2017/09/01/throwing-simple-errors/
| 归档时间: |
|
| 查看次数: |
75860 次 |
| 最近记录: |