3b1b/manim · error · Exception

tip not found

Error message

tip not found

What it means

Raised by TipableVMobject.get_tip (manimlib/mobject/geometry.py:175) when get_tips() returns an empty list — the mobject has neither a 'tip' nor a 'start_tip' attribute. Tips are created by add_tip() (or automatically by Arrow), so a TipableVMobject that never gained a tip has nothing to return.

Source

Thrown at manimlib/mobject/geometry.py:175

    def get_tips(self) -> VGroup:
        """
        Returns a VGroup (collection of VMobjects) containing
        the TipableVMObject instance's tips.
        """
        result = VGroup()
        if hasattr(self, "tip"):
            result.add(self.tip)
        if hasattr(self, "start_tip"):
            result.add(self.start_tip)
        return result

    def get_tip(self) -> ArrowTip:
        """Returns the TipableVMobject instance's (first) tip,
        otherwise throws an exception."""
        tips = self.get_tips()
        if len(tips) == 0:
            raise Exception("tip not found")
        else:
            return tips[0]

    def get_default_tip_length(self) -> float:
        return self.tip_length

    def get_first_handle(self) -> Vect3:
        return self.get_points()[1]

    def get_last_handle(self) -> Vect3:
        return self.get_points()[-2]

    def get_end(self) -> Vect3:
        if self.has_tip():
            return self.tip.get_start()
        else:
            return VMobject.get_end(self)

View on GitHub (pinned to dee01804d4)

Solutions

  1. Use an Arrow (which auto-creates a tip) or call mob.add_tip() before get_tip()
  2. Use get_tips() and check the result length instead of get_tip()
  3. Use hasattr(self, 'tip') / isinstance checks before tip-dependent logic

Example fix

# before
angle = line.get_tip()  # raises: tip not found for plain Line

# after
angle = line.get_angle()  # or:
tips = line.get_tips()
if tips:
    angle = tips[0].get_angle()
Defensive patterns

Strategy: validation

Validate before calling

tips = mob.get_tips()
if len(tips) == 0:
    raise ValueError("no tip present; call add_tip() or use Arrow")
tip = tips[0]

Type guard

def has_tip(mob) -> bool:
    return len(mob.get_tips()) > 0

Try / catch

try:
    tip = mob.get_tip()
except Exception as e:
    if "tip not found" in str(e):
        tip = None  # handle tip-less vectors gracefully
    else:
        raise

Prevention

When it happens

Trigger: Calling get_tip() on a TipableVMobject subclass (e.g. Line used directly) without ever calling add_tip(); deleting/removing the tip from an Arrow then calling get_tip(); calling get_angle()/get_tip() helpers that internally rely on get_tip().

Common situations: Using Line instead of Arrow and then calling get_tip() for angle computation; writing generic code over vector-like mobjects where some have tips and some don't; removing tips after style changes.

Related errors


AI-assisted analysis of 3b1b/manim@dee01804d4 (2026-08-14). Data as JSON: /api/errors/9ace5024b9078858. Report an issue: GitHub.