- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在Swift 2.0之后,Apple 引入了一种新的错误处理方式(do-try-catch)。几天前,在 Beta 6 中引入了一个更新的关键字(try?
)。另外,我知道我可以使用 try!
。这 3 个关键字有什么区别,何时使用它们?
最佳答案
针对 Swift 5.1 进行了更新
假设下面的抛出函数:
enum ThrowableError: Error {
case badError(howBad: Int)
}
func doSomething(everythingIsFine: Bool = false) throws -> String {
if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.badError(howBad: 4)
}
}
当您尝试调用可能抛出异常的函数时,您有 2 个选择。
您可以通过将调用包含在 do-catch block 中来承担处理错误的责任:
do {
let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
// Here you know about the error
// Feel free to handle or to re-throw
// 1. Handle
print("Bad Error (How Bad Level: \(howBad)")
// 2. Re-throw
throw ThrowableError.badError(howBad: howBad)
}
或者只是尝试调用该函数,并将错误传递给调用链中的下一个调用者:
func doSomeOtherThing() <b><i>throws</i></b> -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
当您尝试访问其中包含 nil 的隐式解包可选时会发生什么?是的,没错,应用程序会崩溃!同样尝试!它基本上忽略了错误链,并声明了“做或死”的情况。如果被调用的函数没有抛出任何错误,那么一切正常。但如果失败并抛出错误,您的应用程序将崩溃。
let result = try! doSomething() // if an error was thrown, CRASH!
Xcode 7 beta 6 中引入的新关键字。它返回一个可选的,用于解包成功的值,并通过返回 nil 捕获错误。
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
或者我们可以使用守卫:
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
最后一点,通过使用 try?
请注意,您正在丢弃发生的错误,因为它被转换为 nil。用试试?当您更多地关注成功和失败,而不是失败的原因时。
您可以使用合并运算符 ??试试?在失败时提供默认值:
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
关于swift - 试试!并尝试?有什么区别,什么时候使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32390611/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How do you handle resources in MATLAB in an exception
我有以下方法: class MyClass { public: MyClass; bool method (MyClass &obj); }; void MyClass::method
在Swift 2.0之后,Apple 引入了一种新的错误处理方式(do-try-catch)。几天前,在 Beta 6 中引入了一个更新的关键字(try?)。另外,我知道我可以使用 try!。这 3
如果您认为有可能出现空指针异常,您应该使用 if 语句来确保变量不为空,还是应该捕获异常? 我看不出有什么区别,因为您可以将处理空指针的逻辑放在 if 语句或 catch block 中,那么哪个是最
我想使用try和except,如何从除外回到尝试?代码如下: 尝试: 人脸检测功能 预期NameError: 打印(“未检测到脸部”) 现在这里是我想回到try语句的位置,以便继续搜索面部。有没有办法
我想将我的 name.php 文件重定向/重写到/name/我在另一个主题上找到了解决方案 (http://stackoverflow.com/questions/5527789/htaccess-r
我想避免在多个地方写入 error Count += 1。 我正在寻找比更好的方法 success = False try: ... else: suc
把我的头发拉出来。刚刚做了一个 pod 更新并吸取了 Realm Swift 0.99.1 并且我到处都有 let realm = try! Realm() 行我用 EXC_BAD_INSTRUCTI
我看到有人说使用不带参数的 catch 是一种不好的形式,尤其是当 catch 什么都不做的时候: StreamReader reader=new StreamReader("myfile.txt"
让我们假设一个使用构建器模式构造的对象。 该构建器模式将包含build方法,该方法专注于字段验证,然后转换为目标类型。 可以使用以下方法实现此验证: Either[FailureObject, Tar
我在 Windows 10 中安装了 minikube 。我可以启动 minikube **C:\WINDOWS\system32>minikube start * minikube v1.15.1
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
当我安装 cocoa pod 时,我收到此消息。下载的 cocoa pod 的版本为1.10.1。香港专业教育学院试图使用他们给的命令,但这出现了: 忽略ffi-1.13.1,因为未构建其扩展名。试试
当我尝试构建 Flutter项目至 IOS 它向我显示了这个错误,我尝试清理并尝试更改项目的目录。 Launching lib/main.dart on iPhone 12 Pro Max in de
我试过运行 pod install在我的 Xcode 项目中,但出现以下错误 /System/Library/Frameworks/Ruby.framework/Versions/2.6/us
rails 生成 acts_as_votable:migration忽略 bootsnap-1.3.1,因为它的扩展没有构建。尝试:gem pristine bootsnap --version 1.
我是一名优秀的程序员,十分优秀!