Skip to main content

Ergonomic exception handling for Python.

Project description

trye

Ergonomic exception handling for Python.

Inspired by the ECMAScript Try Operator proposal. Instead of try/except blocks, wrap any callable in trye() and get back a typed Result — either Ok(val) or Err(err).

Requires Python 3.14+ (uses generic syntax and type aliases).

Install

uv add trye

Usage

from trye import trye, Ok, Err

Wrapping a function call

Pass the function and its arguments directly:

result = trye(json.loads, '{"foo": "bar"}')

Or use a lambda for more complex expressions:

result = trye(lambda: db.query("SELECT * FROM users"))

isinstance narrowing

result = trye(json.loads, '{"foo": "bar"}')
if isinstance(result, Ok):
    print(result.val)    # dict
else:
    print(result.err)    # Exception

isinstance with else

result = trye(some_function, arg1, arg2)
if isinstance(result, Err):
    log_error(result.err)
    return
# result is narrowed to Ok here
use_value(result.val)

match/case

result = trye(int, user_input)
match result:
    case Ok(val=v):
        print(f"parsed: {v}")
    case Err(err=e):
        print(f"failed: {e}")

Sentinel fields

Both Ok and Err have sentinel fields so you can always safely check either side:

result = trye(some_function, arg)
if result.err is not None:
    handle_error(result.err)
if result.val is not None:
    use_value(result.val)

Creating results manually

You can create Ok and Err objects directly:

from trye import Ok, Err

success = Ok(42)
failure = Err(ValueError("something went wrong"))

This is useful for bridging non-trye code, writing tests, or returning results from your own functions:

def parse_config(path: str) -> Result[Config]:
    if not path.endswith(".toml"):
        return Err(ValueError(f"unsupported format: {path}"))
    return Ok(load_toml(path))

API

Name Description
trye(f, *args, **kwargs) Call f with args, return Ok(result) or Err(exception)
Ok[T] Success wrapper. .val: T, .err: None
Err Error wrapper. .err: Exception, .val: None
Result[T] Type alias for Ok[T] | Err

Arguments are fully typed via ParamSpec, so type checkers will catch incorrect arguments to the wrapped function.

Development

Install uv, then:

uv sync

This project uses poethepoet for tasks:

uv run poe fmt       # format
uv run poe lint      # lint
uv run poe check     # type check (basedpyright + ty)
uv run poe test      # test

uv run poe all       # all of the above

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

trye-0.1.4.tar.gz (17.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

trye-0.1.4-py3-none-any.whl (4.0 kB view details)

Uploaded Python 3

File details

Details for the file trye-0.1.4.tar.gz.

File metadata

  • Download URL: trye-0.1.4.tar.gz
  • Upload date:
  • Size: 17.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for trye-0.1.4.tar.gz
Algorithm Hash digest
SHA256 e6668ae6facfb9f95a58e45816adecce5c7f5e86a92f67236514cfe49d85bf97
MD5 eba787709cf37b5da5e94593285cac93
BLAKE2b-256 1b72aecab387bd3c738d15dee0bfd979eaf29747bbaebffededb95a3d1755cbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for trye-0.1.4.tar.gz:

Publisher: release.yml on carderne/trye

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file trye-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: trye-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 4.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for trye-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 c54ab05fa79d8be297d0d711f990764106cf16ff4b2fff81a48b877bd3ee1908
MD5 e89cf21a040de561c82f16f1d175aab3
BLAKE2b-256 19e6b5e4efdbbcd809befb23bd0bba2e05d405415d5541a6a57e93af6360b4fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for trye-0.1.4-py3-none-any.whl:

Publisher: release.yml on carderne/trye

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page