If you're tired of writing the same try/catch
block five times a day... you’re not alone.
Java gives you full control over error handling, but with great power comes repetitive boilerplate. Every time we wrap risky code, we write the same dance:
try { var data = risky(); log.info("Success: {}", data); } catch (Exception e) { log.error("Something broke", e); }
And that’s just success/failure. What about retrying? Backoff? Fallback values?
You’ll be adding more layers than a wedding cake 🎂
That’s why I built Catchy
Catchy is a tiny utility that makes Java error handling:
- ✅ Fluent and chainable
- 🔁 Retryable (with backoff)
- 🔄 Transformable (with
.map()
) - 🔥 SLF4J-loggable
- ♻️ Recoverable with fallback values
- 💡 Developer-friendly
The Before & After
Before:
try { var data = risky(); System.out.println(data); } catch (Exception e) { e.printStackTrace(); }
After:
TryWrapper.tryCatch(() -> risky()) .logIfFailure(logger) .onSuccess(val -> System.out.println(val)) .onFailure(err -> System.err.println(err.getMessage()));
Same control. Cleaner code.
🧠 Why Catchy?
Catchy doesn’t replace exceptions — it wraps them with structure. You get:
✅ Less boilerplate
tryCatch(() -> riskyCode())
returns a Result<T>
that you can handle safely.
🔁 Retry logic
With optional delay and exponential backoff:
TryWrapper.tryCatch(() -> connect(), null, 3, 200, true);
♻️ Recovery
Gracefully fallback:
.recover(() -> "default") .recoverWithValue("fallback") .recoverWithMessage("Uh-oh!")
🔄 Transform values
You can transform the success result using .map()
:
.map(val -> val + "!")
If it fails, it gets caught — safely.
🔥 Smart logging
SLF4J logging is built-in and detects exception severity automatically:
Exception Type | Level |
---|---|
NullPointerException | WARN |
RuntimeException | ERROR |
Checked exceptions | INFO |
✅ Real-World Example
TryWrapper.tryCatch(() -> callApi()) .recover(() -> "fallback") .map(val -> val + "!") .logIfFailure(logger) .onSuccess(System.out::println) .onFailure(err -> System.err.println("Fail: " + err.getMessage()));
📦 Get it via JitPack
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories> <dependency> <groupId>com.github.justme8code</groupId> <artifactId>catchy</artifactId> <version>v1.0.0</version> </dependency>
🚀 Why I made Catchy
I'm a Java dev who got tired of writing the same try/catch
block over and over.
Catchy was built for real-world codebases where you want control but don’t want clutter. It's inspired by functional-style Try
, but designed for normal devs who just want clean, readable exception handling.
🙏 Feedback welcome!
If you’ve been fighting Java’s exception boilerplate, give Catchy a spin.
PRs, stars, and suggestions all welcome ❤️
Top comments (0)