Code Monkey home page Code Monkey logo

Comments (5)

leighman avatar leighman commented on July 19, 2024 1

Perfect. Thank you.
No idea why it was hanging jest but without the throw it seems fine.

from effect.

leighman avatar leighman commented on July 19, 2024

We seemed to have the same problem when using Effect.async to wrap it manually

from effect.

fubhy avatar fubhy commented on July 19, 2024

We only want to handle certain cases in the catch and die otherwise.

Note that when using tryPromise with a catch handler to return typed Errors, you are not actually handling the errors, you are just refining them to be handled elsewhere in your application in a type safe manner.

Throwing in catch is odd and I'd avoid that.

If you want to actually handle specific errors, you could use Effect.catchTag(s) subsequently.

However, for the purpose of a test, I'd actually do this completely differently and instead match on an Exit in your program e.g. using Effect.matchCause or by collecting the final Exit value of your entire program and then matching against that (e.g. using Effect.runPromiseExit).

from effect.

leighman avatar leighman commented on July 19, 2024

Yes. I understand I'm only refining them but what if all other cases mean Defect. So you're saying the catch should return BlahFailure | SomeDefectFlag and then I should die on SomeDefectFlag back in Effect land?

from effect.

fubhy avatar fubhy commented on July 19, 2024

There's countless ways to achieve that, e.g. you could refine and use Cause.UnknownException (which is what tryPromise also uses internally) for the fallback case.

You can then also decide to further elevate that into a defect with a subsequent flipWith and filterOrDie. Or you can capture all cases in an Exit and assert based on that (which is what I usually do).

// Effect.Effect<never, MyRefinedError, never>
const program = Effect.tryPromise({
  try: () => Promise.reject(new Error("foo")),
  catch: (cause) => {
    if (cause instanceof Error && cause.message === "foo") {
      return new MyRefinedError(cause)
    }

    return new Cause.UnknownException(cause)
  }
}).pipe(Effect.flipWith(Effect.filterOrDie((cause): cause is MyRefinedError => cause instanceof MyRefinedError, identity)))
// Exit<never, Cause.UnknownException | MyRefinedError>
const exit = await Effect.runPromiseExit(
  Effect.tryPromise({
    try: () => Promise.reject(new Error("foo")),
    catch: (cause) => {
      if (cause instanceof Error && cause.message === "foo") {
        return new MyRefinedError(cause)
      }
  
      return new Cause.UnknownException(cause)
    }
  })
)

from effect.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.