diff --git a/game/engines/default/engine/interface/ActorTalents.lua b/game/engines/default/engine/interface/ActorTalents.lua
index f510797e0995ff796b563d5c43bb7344f2cf114d..fc99dc9d820c3565c09c2a1629ea110b6ccfbdab 100644
--- a/game/engines/default/engine/interface/ActorTalents.lua
+++ b/game/engines/default/engine/interface/ActorTalents.lua
@@ -174,7 +174,11 @@ function _M:useTalent(id, who, force_level, ignore_cd, force_target, silent, no_
 			-- cancel checked in coroutine
 			success, err = coroutine.resume(co)
 		end
-		if not success and err then print(debug.traceback(co)) error(err) end
+		if not success and err then
+			print(debug.traceback(co))
+			self:onTalentLuaError(err)
+			error(err)
+		end
 	elseif ab.mode == "sustained" and ab.activate and ab.deactivate then
 		if self:isTalentCoolingDown(ab) and not ignore_cd then
 			game.logPlayer(who, "%s is still on cooldown for %d turns.", ab.name:capitalize(), self.talents_cd[ab.id])
@@ -280,6 +284,13 @@ function _M:postUseTalent(talent, ret, silent)
 	return true
 end
 
+--- Called if a talent errors out
+-- @param ab the talent
+-- @param err the error
+function _M:onTalentLuaError(ab, err)
+	return
+end
+
 --- Force a talent to activate without using energy or such
 -- "def" can have a field "ignore_energy" to not consume energy; other parameters can be passed and handled by an overload of this method.
 -- Object activation interface calls this method with an "ignore_ressources" parameter
diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua
index 1813144a0255ae721c51235e29fd44e9ebdc6bdd..65e4805feead0f64d18e47a87fea5480034740b8 100644
--- a/game/modules/tome/class/NPC.lua
+++ b/game/modules/tome/class/NPC.lua
@@ -108,6 +108,10 @@ local function spotHostiles(self)
 	return seen
 end
 
+function _M:onTalentLuaError(ab, err)
+	self:useEnergy()  -- prevent infinitely long erroring out turns
+end
+
 --- Try to auto use listed talents
 -- This should be called in your actors "act()" method
 function _M:automaticTalents()