programing

스위프트에서 던지는 것과 다시 던지는 것의 차이점은 무엇입니까?

elecom 2023. 8. 1. 20:17
반응형

스위프트에서 던지는 것과 다시 던지는 것의 차이점은 무엇입니까?

그것을 알아내기 위해 몇 가지 참조를 검색한 후, -불행히도 -나는 -간의 차이를 이해하는 것에 대한 유용한 -그리고 간단한 설명을 찾을 수 없었습니다.throws그리고.rethrows우리가 그것들을 어떻게 사용해야 하는지 이해하려고 할 때 혼란스럽습니다.

저는 -default-에 대해 어느 정도 알고 있습니다.throws다음과 같이 오류를 전파하기 위한 가장 간단한 형식을 사용합니다.

enum CustomError: Error {
    case potato
    case tomato
}

func throwCustomError(_ string: String) throws {
    if string.lowercased().trimmingCharacters(in: .whitespaces) == "potato" {
        throw CustomError.potato
    }

    if string.lowercased().trimmingCharacters(in: .whitespaces) == "tomato" {
        throw CustomError.tomato
    }
}

do {
    try throwCustomError("potato")
} catch let error as CustomError {
    switch error {
    case .potato:
        print("potatos catched") // potatos catched
    case .tomato:
        print("tomato catched")
    }
}

아직까지는 좋지만, 문제는 다음과 같은 경우에 발생합니다.

func throwCustomError(function:(String) throws -> ()) throws {
    try function("throws string")
}

func rethrowCustomError(function:(String) throws -> ()) rethrows {
    try function("rethrows string")
}

rethrowCustomError { string in
    print(string) // rethrows string
}

try throwCustomError { string in
    print(string) // throws string
}

제가 지금까지 알고 있는 것은 함수를 호출할 때입니다.throws그것은 A에 의해 처리되어야 합니다.try와는 달리rethrows그래서 뭐라고요?!사용하기로 결정할 때 따라야 하는 논리는 무엇입니까?throws또는rethrows?

스위프트 책의 "선언"에서:

기능 및 방법 재투입 니다.

함수 또는 메서드는 다음을 사용하여 선언할 수 있습니다.rethrows키워드를 지정하여 함수 매개 변수 중 하나가 오류를 발생시키는 경우에만 오류를 발생시킵니다.이러한 기능 및 방법은 재투입 기능 및 재투입 방법으로 알려져 있습니다.다시 던지기 함수 및 메서드에는 하나 이상의 던지기 함수 매개 변수가 있어야 합니다.

일반적인 예로는 다음과 같은 방법이 방법은 다음과 같습니다.

public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

한다면map비반복 변환을 사용하여 호출되며, 오류 자체를 던지지 않으며, 없이 호출될 수 있습니다.try:

// Example 1:

let a = [1, 2, 3]

func f1(n: Int) -> Int {
    return n * n
}

let a1 = a.map(f1)

하지만 만약에map던지기 클로저와 함께 호출되고 그 자체가 던질 수 있으며 반드시 로 호출되어야 합니다.try:

// Example 2:

let a = [1, 2, 3]
enum CustomError: Error {
    case illegalArgument
}

func f2(n: Int) throws -> Int {
    guard n >= 0 else {
        throw CustomError.illegalArgument
    }
    return n*n
}


do {
    let a2 = try a.map(f2)
} catch {
    // ...
}
  • 한다면map라고 선언되었습니다.throws대신에rethrows그러면 당신은 그것을 전화해야 할 것입니다.try예 1에서도 "비활성화"되어 불필요한 코드를 부풀립니다.
  • 한다면map없이 선언되었습니다.throws/rethrows그러면 예 2에서처럼 던지기 마감으로 호출할 수 없습니다.

함수 매개 변수를 사용하는 Swift Standard Library의 다른 메서드도 마찬가지입니다.filter(),index(where:),forEach()그리고 더 많은 것들.

당신의 경우에는,

func throwCustomError(function:(String) throws -> ()) throws

함수는 실수가 아닌 인수로 호출되더라도 오류를 던질 수 있는 함수를 나타냅니다.

func rethrowCustomError(function:(String) throws -> ()) rethrows

던지기 인수로 호출된 경우에만 오류를 던지는 함수를 나타냅니다.

대충 말하면,rethrows는 "자체적으로" 오류를 던지지 않고 함수 매개 변수의 "순방향" 오류만 던지는 함수에 대한 것입니다.

마틴의 대답과 함께 무언가를 덧붙이자면요.던지기 기능과 동일한 서명을 가진 비투구 기능은sub-type던지기 기능의.그렇기 때문에 리쓰로우는 어떤 것인지 결정할 수 있고 필요한 것만 있습니다.tryfunc 매개 변수도 던지지만 던지지 않는 동일한 함수 서명을 수락하는 경우.func param이 던지면 dry block만 사용하면 되는 편리한 방법이지만, 함수의 다른 코드는 에러를 던지지 않습니다.

언급URL : https://stackoverflow.com/questions/43305051/what-are-the-differences-between-throws-and-rethrows-in-swift

반응형