当前位置: 首页 > 面试题库 >

试试!和尝试?有什么区别,以及何时使用它们?

漆雕奇
2023-03-14
问题内容

在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块中来承担 处理错误 的责任:

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() **_throws_** -> 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


 类似资料:
  • 这个问题不同于关于调试异常的一般建议,因为问题的原因并不总是在调用堆栈上,而特定的建议是必要的。

  • 我使用TestNG已经有一段时间了,但我仍然不知道这两个(suite.xml中的和)的目的是什么,也不知道它们要表达什么抽象。 另外,如果任何人可以分享他们在TestNG中关于其他元素的行为的差异。例如,由或触发,和中的哪一个将进入最终执行报告。

  • 本文向大家介绍请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?相关面试题,主要包含被问及请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 区别: 1、计划和用例编制的先后顺序:从V模型来讲,在需求阶段就要制定系统测试计划和用例,HLD的时候做集成测试计划和用例,有些公司的具体实践不一样,但是顺序肯定是先做系统测试计划

  • 我现在正在尝试学习Spring Security,我已经看到了许多使用它的不同例子。我知道CSRF是什么,Spring Security默认启用了它。我很想知道的是这种定制。 这一行是什么样的定制,以及何时适合使用它。如果有人能给我一个简单的解释,我将不胜感激。

  • 我知道关于这个问题有很多文章和答案,但我真的不明白。我读了许多答案,但我不能完全理解它。我知道什么是联想,聚合,组合。我的问题很简单,只有聚合和关联的区别是什么,什么时候使用它们。我说的不是作文。例如课程和学生是两个类。现在他们之间是哪种关系。是关联还是聚合?

  • 问题内容: 有人向我解释什么和是谁? 我感到困惑的用例都和。 如果您还可以包括一段代码来进行解释,那将是很好的。谢谢! 问题答案: 的目标和是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的事。重要的是您从流中接收信息(或将信息发送到该流中。) 用于阅读许多内容。 用于写很多东西。 这是一些示例代码。它假定和已经创建: