skip to Main Content

Edit: What I am asking is if I want to write logic to both the catch block i.e one while calling throwingFunc1 and while calling throwingFunc2. How to do structure the code.

For example:

func throwingFunc1(_ par: Int) throws -> Int {
  do {
    let model = try throwingFunc2(par: "hello")
   } catch let err {
    print(err)
    // reaching here.
   }
 }

func throwingFunc2(par: String) throws -> Int {
    //return something
 }

Now what I want here is that, when I call throwingFunc1, inside a do-catch block, the catch block is not being called.
Something like this:

do {
   let m = throwingFunc1(2)
  } catch let error {
   //Not reaching here.
 }

How to structure this code such that both catch block is triggered in case throwingFunc2 sends error?

2

Answers


  1. You need to re-throw the error if you want the caller to see it. Currently you’re handling the error, so it is not re-thrown. To rethrow:

    func throwingFunc1(_ par: Int) throws -> Int {
      do {
        let model = try throwingFunc2(par: "hello")
       } catch let err {
        print(err)
        throw err // <---- re-throw the error.
       }
     }
    

    If you have no catch logic in thowingFunc1, you can remove the do/catch, and the try will throw to the caller automatically.

    func throwingFunc1(_ par: Int) throws -> Int {
        let model = try throwingFunc2(par: "hello") // throws on failure
     }
    
    Login or Signup to reply.
  2. You can re-throw the error in the catch block in throwingFunc1:

    func throwingFunc1(_ par: Int) throws -> Int {
        do {
            let model = try throwingFunc2(par: "hello")
        } catch let err {
            print(err)
            throw err
        }
    }
    

    Then the catch block of something like this would be executed:

    do {
        let int = try throwingFunc1(1)
    } catch {
        // ...
    }
    

    Note that the catch block pattern can be omitted:

    catch {
        print(error)
        throw error
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search