بنقرة واحدة
error-handling
Structured domain and transport errors with i18n-friendly messages
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Structured domain and transport errors with i18n-friendly messages
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
PR review triage, scoped fixes, verification, and merge workflow
Web transport boundaries and feature-layer conventions
Workflow and checks for adding a new game system
Meaningful testing strategy and coverage guardrails
Parallel-path refactor workflow for clean boundary cutovers
Go conventions for architecture-first, maintainable code
| name | error-handling |
| description | Structured domain and transport errors with i18n-friendly messages |
| user-invocable | true |
Use structured errors (internal/platform/errors) to:
Step 1: Add an error code in internal/platform/errors/codes.go:
const (
// Group by domain (Campaign, Session, Character, etc.)
CodeMyNewError Code = "MY_DOMAIN_ERROR_NAME"
)
Code naming convention: {DOMAIN}_{SPECIFIC_ERROR} in SCREAMING_SNAKE_CASE.
Step 2: Map to gRPC code in the GRPCCode() switch:
case CodeMyNewError:
return codes.InvalidArgument // or NotFound, FailedPrecondition, etc.
Step 3: Add user-facing message in internal/platform/errors/i18n/en_us.go:
"MY_DOMAIN_ERROR_NAME": "Human-readable message with {{.Param}} support",
Step 4: Use in domain code:
import apperrors "github.com/louisbranch/fracturing.space/internal/platform/errors"
// Simple error
return apperrors.New(apperrors.CodeMyNewError, "internal: detailed message")
// Error with metadata (for templated user messages)
return apperrors.WithMetadata(
apperrors.CodeMyNewError,
"internal: transition from X to Y failed",
map[string]string{"Param": "value"},
)
// Wrapping another error
return apperrors.Wrap(apperrors.CodeMyNewError, "operation failed", underlyingErr)
Create a new code when:
Don't create a new code when:
CodeUnknown).// Check for specific error code
if apperrors.IsCode(err, apperrors.CodeNotFound) {
// Handle not found
}
// Extract error details
var appErr *apperrors.Error
if errors.As(err, &appErr) {
log.Printf("Code: %s, Message: %s", appErr.Code, appErr.Message)
}
| gRPC Code | Use For |
|---|---|
InvalidArgument | Bad user input, validation failures |
NotFound | Resource doesn't exist |
FailedPrecondition | State doesn't allow operation |
Internal | Unexpected errors (default) |