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

Swift do-try-catch语法

松国兴
2023-03-14
问题内容

我尝试理解Swift 2中新的错误处理方法。这是我做的:我首先声明了一个错误枚举:

enum SandwichError: ErrorType {
    case NotMe
    case DoItYourself
}

然后我声明了一个引发错误的方法(伙计们不是异常。这是一个错误。)。这是该方法:

func makeMeSandwich(names: [String: String]) throws -> String {
    guard let sandwich = names["sandwich"] else {
        throw SandwichError.NotMe
    }

    return sandwich
}

问题出在呼叫方。这是调用此方法的代码:

let kitchen = ["sandwich": "ready", "breakfeast": "not ready"]

do {
    let sandwich = try makeMeSandwich(kitchen)
    print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
    print("Not me error")
} catch SandwichError.DoItYourself {
    print("do it error")
}

之后,do行编译器说Errors thrown from here are not handled because the enclosing catch is not exhaustive。但是我认为这是详尽无遗的,因为SandwichError枚举中只有两种情况。

对于常规的switch语句,swift可以理解,在处理每种情况时,它都是详尽的。


问题答案:

Swift 2错误处理html" target="_blank">模型有两个重要方面:详尽性和弹性。它们一起归结为您的do/
catch语句,需要捕获所有可能的错误,而不仅仅是您知道可以抛出的错误。

请注意,您并未声明函数会抛出什么类型的错误,仅声明它是否会抛出任何类型的错误。这是一个零一无穷的问题:当有人为他人(包括您将来的自己)定义一个函数供您使用时,您不必让每个函数的客户都适应您实现中的每一个变化功能,包括它可能引发的错误。您希望调用您的函数的代码能够适应这种变化。

因为您的函数无法说出它抛出的错误类型(或将来可能抛出的错误),所以catch捕获该错误的块不知道它可能抛出的错误类型。因此,除了处理您所知道的错误类型之外,您还需要使用通用catch语句来处理那些您不知道的错误类型-
这样,如果您的函数更改了将来抛出的错误集,则调用方仍将捕获该错误类型错误。

do {
    let sandwich = try makeMeSandwich(kitchen)
    print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
    print("Not me error")
} catch SandwichError.DoItYourself {
    print("do it error")
} catch let error {
    print(error.localizedDescription)
}

但是,我们不要就此止步。再考虑一下这种弹性思想。设计三明治的方式必须在使用它们的每个地方描述错误。这意味着,每当更改错误案例集时,都必须更改使用它们的每个位置……不是很有趣。

定义自己的错误类型的想法是让您集中诸如此类的事情。您可以description为错误定义一个方法:

extension SandwichError: CustomStringConvertible {
    var description: String {
        switch self {
            case NotMe: return "Not me error"
            case DoItYourself: return "Try sudo"
        }
    }
}

然后,您的错误处理代码可以要求您的错误类型进行自我描述-现在,您处理错误的每个地方都可以使用相同的代码,并且还可以处理将来可能发生的错误情况。

do {
    let sandwich = try makeMeSandwich(kitchen)
    print("i eat it \(sandwich)")
} catch let error as SandwichError {
    print(error.description)
} catch {
    print("i dunno")
}

这也为错误类型(或错误扩展)支持其他报告错误的方式铺平了道路-
例如,您可以在错误类型上拥有扩展名,该扩展名知道如何向UIAlertControlleriOS用户报告错误。



 类似资料:
  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 我刚刚开始用java编写一个21点游戏。我试图让程序要求用户再次输入,如果他们输入的现金不是一个有效的整数。我看到许多带有catch的try语句示例,但没有一个是有效的。程序给出的错误InputMismatchException无法解析为类型。我遵循的一个线程就是这个,我有完全相同的代码,只是变量名不同。给你。Java输入不匹配异常 这是我的密码: 任何关于为什么我几乎精确的代码不起作用的帮助都将

  • 主要内容:多重catch语句在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。Java 的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。 Java 的异常处理通过 5 个关键字来实现: try、 catch、 throw、 throws 和 finally

  • 我在Java中所知的程度可以通过两种方式报告错误:返回值和异常。例如,下面的代码: 另一个观察结果是:如果取消对最后一条“return result”语句的注释,则会得到一条错误消息: 变量结果可能未初始化 ;如果对最后一条“return result”进行注释,则会得到一条错误消息: 缺少return语句 但是我已经在try子句中包含了return语句。

  • 问题内容: 在内部使用try / catch或在内部使用try / catch的正确方法是什么? 与 问题答案: 在我看来,我的观点是: 以上是正确的方法。 因为,使用这种方法,如果与数据库的连接存在异常,则将其捕获在catch块内。但是使用第一种方法,则不会。

  • 在我必须进行的猜测游戏中,我需要包含一个带有两个catch子句的try-catch块(一个多catch块用于我的两个自定义异常:和,一个块用于)。 我试图在程序中创建条件来抛出自定义异常,因为我不知道它们如何正常工作的逻辑。我有编译错误,希望能帮助重新运行我的程序,以便它正确地实现try-catch块。 我的自定义异常类: 我的程序有编译错误: