Answers:
最简单的方法可能是定义一个定制的enum
只有一个case
是有一个String
连接到它:
enum MyError: ErrorType {
case runtimeError(String)
}
或者,从Swift 4开始:
enum MyError: Error {
case runtimeError(String)
}
示例用法如下所示:
func someFunction() throws {
throw MyError.runtimeError("some message")
}
do {
try someFunction()
} catch MyError.runtimeError(let errorMessage) {
print(errorMessage)
}
如果要使用现有Error
类型,最通用的类型是NSError
,您可以使用工厂方法来创建并使用自定义消息抛出。
String
您的问题errorMessage
,如果可以,我该怎么做?
String
与此相关的MyError.RuntimeError
(在集合的时间throw
),并且你获得在访问它catch
(带let errorMessage
)。
try!
,此处未使用。如果没有某种通知,您的确无法发出潜在的投掷声try
。(此外,代码的一部分是示例用法,而不是实际的解决方案。)
最简单的方法是使String
符合Error
:
extension String: Error {}
然后就可以抛出一个字符串:
throw "Some Error"
要使字符串本身成为localizedString
错误的,您可以扩展LocalizedError
:
extension String: LocalizedError {
public var errorDescription: String? { return self }
}
localizedDescription
成为字符串本身呢?
Redundant conformance of 'String' to protocol 'Error'
:(
error.localizedDescription
在抛出字符串后进行解析时无法完成操作。
@ 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
}
}
并使用:
throw RuntimeError("Error message.")
签出这个很酷的版本。这个想法是同时实现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."
}
用法:
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
}
as User.UserValidationError
和.rawValue
。但是,如果不是执行CustomStringConvertible
的var description: String { return rawValue }
,这可能是获得使用枚举语法自定义说明,而不必经过有用的rawValue
,你打印的每一个地方。
斯威夫特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)")
}
}
印刷品:
Caught NSError: The operation could not be completed, my error description, 42
User info:
key=ui1, value=12
key=ui2, value=val2
这样,您就可以提供自定义字符串,以及数字代码和字典,其中包括任何类型的所需的所有其他数据。
注意:这已在OS = Linux(Ubuntu 16.04 LTS)上进行了测试。
最简单的解决方案,无需额外的扩展,枚举,类等:
NSException(name:NSExceptionName(rawValue: "name"), reason:"reason", userInfo:nil).raise()
raise()
而不是throw
)的咒语。将您的解决方案与抛出异常的位置数相乘,throw Foo.Bar("baz")
或者throw "foo"
乘以抛出异常的位置数-IMO一线扩展或枚举的一次性费用比诸如此类的费用要好得多NSExceptionName
。
postNotification
需要2-3个参数,并且其选择器与此类似。您是否重写Notification
和/或NotificationCenter
在每个项目中都允许它接受较少的输入参数?
String
以符合标准Error
太令人惊讶,或者MyError
枚举是否过于含糊(我个人会对两者都回答“是”,而是针对每个错误分别进行枚举,例如,throw ThisTypeOfError.thisParticularCase
)。
基于@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
}
最初发布在我的快速博客上:http : //eon.codes/blog/2017/09/01/throwing-simple-errors/
throw NSError(message: "err", code: 0)
domain
,不是message
,对吧?