From a80b5269e6c0dc1191edbc8746fb914650364fe2 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 23 Jan 2013 23:47:15 +0100 Subject: [PATCH] log failures in postStop, see #2928 --- .../src/test/scala/akka/actor/ActorLifeCycleSpec.scala | 10 ++++++++++ .../main/scala/akka/actor/dungeon/FaultHandling.scala | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala index ec99f97180..bcfc9fa0e8 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala @@ -119,6 +119,16 @@ class ActorLifeCycleSpec extends AkkaSpec with BeforeAndAfterEach with ImplicitS system.stop(supervisor) } + "log failues in postStop" in { + val a = system.actorOf(Props(new Actor { + def receive = Actor.emptyBehavior + override def postStop { throw new Exception("hurrah") } + })) + EventFilter[Exception]("hurrah", occurrences = 1) intercept { + a ! PoisonPill + } + } + "clear the behavior stack upon restart" in { case class Become(recv: ActorContext ⇒ Receive) val a = system.actorOf(Props(new Actor { diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala index 7ff93e9e53..b97313d794 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala @@ -199,7 +199,9 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ * specific order. */ try if (a ne null) a.postStop() - finally try dispatcher.detach(this) + catch { + case NonFatal(e) ⇒ publish(Error(e, self.path.toString, clazz(a), e.getMessage)) + } finally try dispatcher.detach(this) finally try parent.sendSystemMessage(ChildTerminated(self)) finally try parent ! NullMessage // read ScalaDoc of NullMessage to see why finally try tellWatchersWeDied(a)