diff --git a/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
index f5a27b55a..b425f55f6 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
@@ -81,9 +81,9 @@ abstract public class AppenderBase<E> extends ContextAwareBase implements Append
             // ok, we now invoke derived class' implementation of append
             this.append(eventObject);
 
-        } catch (Exception e) {
+        } catch (Throwable t) {
             if (exceptionCount++ < ALLOWED_REPEATS) {
-                addError("Appender [" + name + "] failed to append.", e);
+                addError("Appender [" + name + "] failed to append.", t);
             }
         } finally {
             guard = false;
diff --git a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
index 26cef507b..bb70218c2 100755
--- a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
@@ -282,25 +282,40 @@ public class AsyncAppenderBase<E> extends UnsynchronizedAppenderBase<E> implemen
         public void run() {
             AsyncAppenderBase<E> parent = AsyncAppenderBase.this;
             AppenderAttachableImpl<E> aai = parent.aai;
-
-            // loop while the parent is started
-            while (parent.isStarted()) {
-                try {
-                    E e = parent.blockingQueue.take();
-                    aai.appendLoopOnAppenders(e);
-                } catch (InterruptedException ie) {
-                    break;
+            try {
+                // loop while the parent is started
+                while (parent.isStarted()) {
+                    E e = null;
+                    try {
+                        e = parent.blockingQueue.take();
+                        aai.appendLoopOnAppenders(e);
+                    } catch (InterruptedException ie) {
+                        break;
+                    } catch (Throwable t) {
+                        try {
+                            addError("Failed to append event: " + e, t);
+                        } catch (Throwable t2) {
+                            // Ignore second throwable and prevent unexpected thread termination.
+                        }
+                    }
                 }
-            }
 
-            addInfo("Worker thread will flush remaining events before exiting. ");
-
-            for (E e : parent.blockingQueue) {
-                aai.appendLoopOnAppenders(e);
-                parent.blockingQueue.remove(e);
+                addInfo("Worker thread will flush remaining events before exiting. ");
+
+                for (E e : parent.blockingQueue) {
+                    try {
+                        try {
+                            aai.appendLoopOnAppenders(e);
+                        } finally {
+                            parent.blockingQueue.remove(e);
+                        }
+                    } catch (Throwable t) {
+                        addError("Failed to append event [" + e + "].", t);
+                    }
+                }
+            } finally {
+                aai.detachAndStopAllAppenders();
             }
-
-            aai.detachAndStopAllAppenders();
         }
     }
 }
diff --git a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
index 918a8c6d3..334dc30b0 100755
--- a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
@@ -17,6 +17,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import ch.qos.logback.core.testUtil.OOMAppender;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -86,6 +87,24 @@ public class AsyncAppenderBaseTest {
         assertEquals(AppenderBase.ALLOWED_REPEATS, statusChecker.matchCount("Appender \\[bad\\] failed to append."));
     }
 
+    @Test
+    public void errorsShouldNotCauseHalting() {
+        OOMAppender<Integer> oomAppender = new OOMAppender<Integer>();
+        oomAppender.setName("bad");
+        oomAppender.setContext(context);
+        oomAppender.start();
+
+        asyncAppenderBase.addAppender(oomAppender);
+        asyncAppenderBase.start();
+        assertTrue(asyncAppenderBase.isStarted());
+        for (int i = 0; i < 10; i++)
+            asyncAppenderBase.append(i);
+
+        asyncAppenderBase.stop();
+        assertFalse(asyncAppenderBase.isStarted());
+        assertEquals(AppenderBase.ALLOWED_REPEATS, statusChecker.matchCount("Appender \\[bad\\] failed to append."));
+    }
+
     @Test(timeout = 2000)
     public void emptyQueueShouldBeStoppable() {
         asyncAppenderBase.addAppender(listAppender);
