Exception Handling¶
Structured exception types for better error handling in GitHub Actions.
Overview¶
The toolkit provides a comprehensive exception taxonomy for better error handling and debugging. All exceptions inherit from GitHubActionError and provide specific exception classes for different error scenarios.
Note: Import exceptions from github_action_toolkit.exceptions:
from github_action_toolkit.exceptions import (
GitHubActionError,
EnvironmentVariableError,
InputError,
GitOperationError,
GitHubAPIError,
ConfigurationError,
CacheNotFoundError,
CacheRestoreError,
CacheSaveError,
CancellationRequested,
RateLimitError,
APIError,
)
Exception Hierarchy¶
GitHubActionError¶
Base exception for all github-action-toolkit errors. You can catch this to handle any toolkit-specific error.
example:
from github_action_toolkit import set_output
from github_action_toolkit.exceptions import GitHubActionError
try:
set_output("my_output", "value")
except GitHubActionError as e:
print(f"Toolkit error: {e}")
EnvironmentVariableError¶
Raised when required environment variables are missing or invalid. This typically occurs when the toolkit is not running in a GitHub Actions context or required environment variables are not set.
example:
from github_action_toolkit import set_output
from github_action_toolkit.exceptions import EnvironmentVariableError
try:
set_output("my_output", "value")
except EnvironmentVariableError as e:
print(f"Missing environment variable: {e}")
# Error message: "GITHUB_OUTPUT environment variable is not set..."
InputError¶
Raised when user input is invalid or cannot be parsed. This occurs when converting input values to specific types fails or when required inputs are missing.
example:
from github_action_toolkit import get_user_input_as
from github_action_toolkit.exceptions import InputError
try:
port = get_user_input_as("port", int)
except InputError as e:
print(f"Invalid input: {e}")
# Error message: "Cannot convert input 'port' with value 'abc' to int..."
GitOperationError¶
Raised when git operations fail. This occurs during repository operations like clone, checkout, commit, push, etc.
example:
from github_action_toolkit import Repo
from github_action_toolkit.exceptions import GitOperationError
try:
repo = Repo(url="https://invalid-url.com/repo.git")
except GitOperationError as e:
print(f"Git operation failed: {e}")
GitHubAPIError¶
Raised when GitHub API operations fail. This occurs when interacting with GitHub APIs for artifacts, PRs, etc.
example:
from github_action_toolkit import GitHubArtifacts
from github_action_toolkit.exceptions import GitHubAPIError
try:
artifacts = GitHubArtifacts(github_token="invalid_token")
except GitHubAPIError as e:
print(f"GitHub API error: {e}")
ConfigurationError¶
Raised when configuration is invalid or incomplete. This occurs when required configuration parameters are missing or invalid.
example:
from github_action_toolkit import Repo
from github_action_toolkit.exceptions import ConfigurationError
try:
repo = Repo() # Neither url nor path provided
except ConfigurationError as e:
print(f"Configuration error: {e}")
# Error message: "Either 'url' or 'path' must be provided..."
Best Practices¶
Catch Specific Exceptions¶
Catch specific exception types to handle different error scenarios appropriately:
from github_action_toolkit import get_user_input_as, set_output
from github_action_toolkit.exceptions import (
EnvironmentVariableError,
InputError,
ConfigurationError,
)
try:
timeout = get_user_input_as("timeout", int, default_value=30)
set_output("timeout_value", timeout)
except InputError as e:
print(f"Invalid timeout input: {e}")
# Provide default or exit
except EnvironmentVariableError as e:
print(f"Not running in GitHub Actions: {e}")
# Handle non-GitHub Actions environment
except Exception as e:
print(f"Unexpected error: {e}")
raise
Use Error Messages for Debugging¶
All exceptions provide actionable error messages that explain:
What went wrong
Why it went wrong
How to fix it
from github_action_toolkit import GitHubArtifacts
from github_action_toolkit.exceptions import ConfigurationError
try:
artifacts = GitHubArtifacts(github_repo="invalid")
except ConfigurationError as e:
# Error message includes: "github_repo must be in 'owner/repo' format, got 'invalid'"
# and suggests: "Example: 'octocat/hello-world'"
print(e)
Cancellation Exception¶
CancellationRequested- Raised when a cancellation signal (SIGTERM, SIGINT) is received
from github_action_toolkit import enable_cancellation_support
from github_action_toolkit.exceptions import CancellationRequested
enable_cancellation_support()
try:
# Your long-running operation
pass
except CancellationRequested:
print("Operation cancelled gracefully")