Custom Exceptions and Chaining

Scenario: A deployment failure should say DeploymentError, not expose a low-level conversion detail alone.

New words, in plain English

Custom names let callers handle meaningful failures. Include useful data, keep the hierarchy small, and chain lower-level errors to preserve evidence.

Analogy: A Python program is like a clear set of instructions for a careful helper: names label things, indentation groups steps, and errors explain where the helper became confused.

A small, real example

class DeploymentError(Exception):
    pass

def parse_port(raw):
    try:
        return int(raw)
    except ValueError as error:
        raise DeploymentError("invalid deployment port") from error
Tip: Exceptions are for exceptional outcomes, not ordinary loop control.
Goal: Practice this idea in the py-custom-exceptions challenge at /labs/python. Fix the broken program, run it yourself, then use check to prove the real end state.