diff --git a/noexception/README.md b/noexception/README.md
new file mode 100644
index 0000000000..d840191369
--- /dev/null
+++ b/noexception/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception)
diff --git a/noexception/pom.xml b/noexception/pom.xml
new file mode 100644
index 0000000000..64c0591fda
--- /dev/null
+++ b/noexception/pom.xml
@@ -0,0 +1,23 @@
+
+ 4.0.0
+
+ com.baeldung
+ noexception
+ 1.0
+ noexception
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.machinezoo.noexception
+ noexception
+ 1.1.0
+
+
+
diff --git a/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
new file mode 100644
index 0000000000..59e13efaa0
--- /dev/null
+++ b/noexception/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
@@ -0,0 +1,24 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.ExceptionHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomExceptionHandler extends ExceptionHandler {
+
+ private Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
+
+ @Override
+ public boolean handle(Throwable throwable) {
+
+ if (throwable.getClass()
+ .isAssignableFrom(RuntimeException.class)
+ || throwable.getClass()
+ .isAssignableFrom(Error.class)) {
+ return false;
+ } else {
+ logger.error("Caught Exception ", throwable);
+ return true;
+ }
+ }
+}
diff --git a/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java b/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
new file mode 100644
index 0000000000..690ea43520
--- /dev/null
+++ b/noexception/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.noexception;
+
+import com.machinezoo.noexception.Exceptions;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NoExceptionUnitTest {
+
+ private static Logger logger = LoggerFactory.getLogger(NoExceptionUnitTest.class);
+
+ @Test
+ public void whenStdExceptionHandling_thenCatchAndLog() {
+ try {
+ System.out.println("Result is " + Integer.parseInt("foobar"));
+ } catch (Throwable exception) {
+ logger.error("Caught exception:", exception);
+ }
+ }
+
+ @Test
+ public void whenDefaultNoException_thenCatchAndLog() {
+
+ Exceptions.log().run(() -> System.out.println("Result is " + Integer.parseInt("foobar")));
+ }
+
+ @Test
+ public void givenLogger_whenDefaultNoException_thenCatchAndLogWithClassName() {
+ System.out.println("Result is " + Exceptions.log(logger).get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test
+ public void givenLoggerAndMessage_whenDefaultNoException_thenCatchAndLogWithClassNameAndMessage() {
+ System.out.println("Result is " + Exceptions.log(logger, "Something went wrong:").get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test
+ public void givenDefaultValue_whenDefaultNoException_thenCatchAndLogPrintDefault() {
+ System.out.println("Result is " + Exceptions.log(logger, "Something went wrong:").get(() -> +Integer.parseInt("foobar")).orElse(-1));
+ }
+
+ @Test(expected = Error.class)
+ public void givenCustomHandler_whenError_thenRethrowError() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwError());
+ }
+
+ @Test
+ public void givenCustomHandler_whenException_thenCatchAndLog() {
+ CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler();
+ customExceptionHandler.run(() -> throwException());
+ }
+
+ private static void throwError() {
+ throw new Error("This is very bad.");
+ }
+
+ private static void throwException() {
+ String testString = "foo";
+ testString.charAt(5);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index f33d63bc48..8b3df8de0d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,6 +106,7 @@
mockito2
mocks
mustache
+ noexception
orika