我想在Swift中做一些我习惯在其他多种语言中做的事情:用自定义消息抛出运行时异常。例如(在Java中):
throw new RuntimeException("A custom message here")
我知道我可以抛出符合ErrorType协议的枚举类型,但我不希望必须为抛出的每种类型的错误定义枚举。理想情况下,我希望能够尽可能地模拟上面的示例。我考虑创建一个实现ErrorType协议的自定义类,但我甚至不知道该协议需要什么。想法吗?
我想在Swift中做一些我习惯在其他多种语言中做的事情:用自定义消息抛出运行时异常。例如(在Java中):
throw new RuntimeException("A custom message here")
我知道我可以抛出符合ErrorType协议的枚举类型,但我不希望必须为抛出的每种类型的错误定义枚举。理想情况下,我希望能够尽可能地模拟上面的示例。我考虑创建一个实现ErrorType协议的自定义类,但我甚至不知道该协议需要什么。想法吗?
当前回答
最简单的方法是使String符合Error:
extension String: Error {}
然后你可以抛出一个字符串:
throw "Some Error"
为了让字符串本身成为错误的localizedString,你可以扩展LocalizedError:
extension String: LocalizedError {
public var errorDescription: String? { return self }
}
其他回答
我喜欢@Alexander-Borisenko的回答,但是当被捕捉为错误时,本地化的描述没有返回。看起来你需要使用LocalizedError代替:
struct RuntimeError: LocalizedError
{
let message: String
init(_ message: String)
{
self.message = message
}
public var errorDescription: String?
{
return message
}
}
更多细节请看这个答案。
最简单的解决方案,没有额外的扩展,枚举,类等:
NSException(name:NSExceptionName(rawValue: "name"), reason:"reason", userInfo:nil).raise()
斯威夫特4:
按:
https://developer.apple.com/documentation/foundation/nserror
如果你不想定义一个自定义异常,你可以使用一个标准NSError对象,如下所示:
import Foundation
do {
throw NSError(domain: "my error domain", 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 domain, 42
User info:
key=ui1, value=12
key=ui2, value=val2
这允许您提供一个自定义字符串(错误域),加上一个数字代码和一个字典,其中包含您需要的所有其他类型的数据。
注意:这是在OS=Linux (Ubuntu 16.04 LTS)上测试的。
重申一下@pj-finnegan的回答,几个人的评论,以及公认答案的脚注…
我更喜欢这里提供的其他几个答案(如果我在寻找最佳实践)。但如果我回答问题,最简单的方法是这样做(IFF你是在iOS/macOS/…)是使用桥接类型NSError。
func myFunction(meNoLikey:Bool) throws {
guard meNoLikey == false else {
throw NSError(domain: "SubsystemOfMyApp", code: 99, userInfo: [NSLocalizedDescriptionKey: "My Message!"] )
}
// safe to carry on…
}
您可以决定是否拥有有意义的域或代码。userInfo键NSLocalizedDescriptionKey是传递您请求的消息所需要的唯一东西。
查找NSError。UserInfoKey用于您想在userInfo中提供的任何其他细节。如果您想将细节传递给任何捕捉到错误的人,还可以添加任何您想添加的内容。
如果你不需要捕捉错误,你想立即停止应用程序,你可以使用一个fatalError: fatalError("自定义消息在这里")