Repository navigation
♻️ Create exceptions module and TyperException base class - #1942
Merged
Merged
Conversation
tiangolo
approved these changes
Aug 28, 2026
tiangolo
left a comment
Member
There was a problem hiding this comment.
Nice, thank you! 🚀
This will be available in Typer 0.27.2 in the next few hours.
ksparavec
added a commit
to devitops-com/aiagent
that referenced
this pull request
Sep 14, 2026
Typer 0.27.2 moved Abort out of typer._click.exceptions into the new typer.exceptions module (fastapi/typer#1942). cli/app.py imported Abort and UsageError from the vendored module in a single try block, so the relocation raised ImportError and dropped the vendored UsageError from _USAGE_ERRORS as collateral damage. Typer raises its own vendored UsageError, not the stdlib Click one, so every usage error — unknown command, missing required argument — then escaped main() as an unhandled traceback, and exited 0 while doing it. Take Abort from the public typer.Abort instead: it is re-exported at the Typer top level across the supported range, so it survives the class moving between internal modules. UsageError is not top-level exported and stays in the vendored Click module, so it keeps its guarded import — but in a try of its own, so one class moving can never again take the other down with it. No test caught this because every CLI test drives `app` through CliRunner and so never reaches main()'s handlers. Add one that runs the module entry point end to end and asserts help + exit 2 with no traceback; confirmed it fails against the pre-fix code. Also rewrite the metavar assertion: Typer 0.27.0 changed metavar rendering (breaking, fastapi/typer#1863), so the usage line reads "{skill}" rather than "SKILL". Both spellings are live here — the venv resolves Typer from the floors while the bundle installs the lock — so match the usage line case-insensitively. Scoping to that line also fixes a false pass: `run` prints the word SKILL in an unrelated --route description, so the old whole-output check passed even when the metavar itself had gone. Latent for any fresh install; unrelated to the Python version. make check + make test green (178 passed, 90% coverage).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request
Discussion: #1832
Description
Continuing from the original Click vendoring, this PR introduces a new base class
TyperExceptionthat all other exception classes inherit from. This is to replace a check forClickException(which some users may want to do, cf discusssion thread) which is currently in the private module_clickand shouldn't be used/imported directly. The "old" Click exception hierarchy will be refactored in the near future and shouldn't be used directly either.AbortandExithave always been part of the public Typer API and as such they are moved into the new Typer module.AI Disclaimer
No AI used, just good old fashioned human communication & thinking. Refreshing 😎
Checklist