Pular para o conteúdo
Skillpedia
Código em geral280 mil · #53

error-handling

Ajuda seu agente a lidar com erros de forma robusta em diferentes linguagens. Ele define como os erros são tratados, se recupera de falhas e informa o usuário.

O que ela faz

Esta habilidade ensina como lidar com erros em programas de computador. Ela ajuda a garantir que os programas não parem de funcionar inesperadamente e que os usuários recebam mensagens claras quando algo der errado.

Quando usar

  • ✓Ao criar um novo programa ou parte dele.
  • ✓Quando um programa precisa se conectar a outros serviços.
  • ✓Ao pensar em como mostrar mensagens de erro para os usuários.

Exemplo do que pedir para a IA

“Como posso garantir que meu programa informe o usuário de forma amigável se ele não conseguir encontrar um item?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/error-handling/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/error-handling/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ela sugere usar 'tipos' de erro para entender o que aconteceu e criar mensagens diferentes para o usuário e para o programador. Também ensina a não ignorar erros e a tratar falhas de forma consistente.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill error-handling

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/error-handling/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Tratamento de Erros

Padrões consistentes e robustos de tratamento de erros para aplicações em produção.

Quando Ativar

  • Projetando tipos de erro ou hierarquias de exceção para um novo módulo ou serviço
  • Adicionando lógica de retentativa ou disjuntores para dependências externas não confiáveis
  • Revisando endpoints de API em busca de tratamento de erros ausente
  • Implementando mensagens e feedback de erro voltados para o usuário
  • Depurando falhas em cascata ou "engolimento" silencioso de erros

Princípios Fundamentais

  1. Falhar rápido e de forma explícita — exponha erros na fronteira onde ocorrem; não os enterre
  2. Erros tipados em vez de mensagens de texto — erros são valores de primeira classe com estrutura
  3. Mensagens para o usuário ≠ mensagens para o desenvolvedor — mostre texto amigável aos usuários, registre o contexto completo no lado do servidor
  4. Nunca engula erros silenciosamente — cada bloco catch deve tratar, relançar ou registrar
  5. Erros fazem parte do seu contrato de API — documente cada código de erro que um cliente pode receber

TypeScript / JavaScript

Classes de Erro Tipadas

// Define an error hierarchy for your domain
export class AppError extends Error {
  constructor(
    message: string,
    public readonly code: string,
    public readonly statusCode: number = 500,
    public readonly details?: unknown,
  ) {
    super(message)
    this.name = this.constructor.name
    // Maintain correct prototype chain in transpiled ES5 JavaScript.
    // Required for `instanceof` checks (e.g., `error instanceof NotFoundError`)
    // to work correctly when extending the built-in Error class.
    Object.setPrototypeOf(this, new.target.prototype)
  }
}

export class NotFoundError extends AppError {
  constructor(resource: string, id: string) {
    super(`${resource} not found: ${id}`, 'NOT_FOUND', 404)
  }
}

export class ValidationError extends AppError {
  constructor(message: string, details: { field: string; message: string }[]) {
    super(message, 'VALIDATION_ERROR', 422, details)
  }
}

export class UnauthorizedError extends AppError {
  constructor(reason = 'Authentication required') {
    super(reason, 'UNAUTHORIZED', 401)
  }
}

export class RateLimitError extends AppError {
  constructor(public readonly retryAfterMs: number) {
    super('Rate limit exceeded', 'RATE_LIMITED', 429)
  }
}

Padrão Result (estilo sem exceção)

Para operações onde a falha é esperada e comum (parsing, chamadas externas):

type Result<T, E = AppError> =
  | { ok: true; value: T }
  | { ok: false; error: E }

function ok<T>(value: T): Result<T> {
  return { ok: true, value }
}

function err<E>(error: E): Result<never, E> {
  return { ok: false, error }
}

// Usage
async function fetchUser(id: string): Promise<Result<User>> {
  try {
    const user = await db.users.findUnique({ where: { id } })
    if (!user) return err(new NotFoundError('User', id))
    return ok(user)
  } catch (e) {
    return err(new AppError('Database error', 'DB_ERROR'))
  }
}

const result = await fetchUser('abc-123')
if (!result.ok) {
  // TypeScript knows result.error here
  logger.error('Failed to fetch user', { error: result.error })
  return
}
// TypeScript knows result.value here
console.log(result.value.email)

Manipulador de Erro de API (Next.js / Express)

import { NextRequest, NextResponse } from 'next/server'

function handleApiError(error: unknown): NextResponse {
  // Known application error
  if (error instanceof AppError) {
    return NextResponse.json(
      {
        error: {
          code: error.code,
          message: error.message,
          ...(error.details ? { details: error.details } : {}),
        },
      },
      { status: error.statusCode },
    )
  }

  // Zod validation error
  if (error instanceof z.ZodError) {
    return NextResponse.json(
      {
        error: {
          code: 'VALIDATION_ERROR',
          message: 'Request validation failed',
          details: error.issues.map(i => ({
            field: i.path.join('.'),
            message: i.message,
          })),
        },
      },
      { status: 422 },
    )
  }

  // Unexpected error — log details, return generic message
  console.error('Unexpected error:', error)
  return NextResponse.json(
    { error: { code: 'INTERNAL_ERROR', message: 'An unexpected error occurred' } },
    { status: 500 },
  )
}

export async function POST(req: NextRequest) {
  try {
    // ... handler logic
  } catch (error) {
    return handleApiError(error)
  }
}

Limite de Erro do React


…
Perguntas frequentes

Por que é importante lidar com erros?

Lidar com erros evita que o programa trave, ajuda a identificar problemas rapidamente e garante uma melhor experiência para o usuário, que recebe feedback claro em vez de mensagens confusas.

O que são 'erros tipados'?

São erros que possuem informações estruturadas (como um código e uma mensagem específica), em vez de serem apenas um texto. Isso ajuda o programa a entender melhor o tipo de problema.

Devo mostrar a mesma mensagem de erro para o usuário e para o programador?

Não. Para o usuário, use mensagens simples e amigáveis. Para o programador (em logs, por exemplo), inclua detalhes técnicos para facilitar a depuração.

Detalhes

Descrição original do autor

Patterns for robust error handling across TypeScript, Python, and Go. Covers typed errors, error boundaries, retries, circuit breakers, and user-facing error messages. Use when designing error types, retries, circuit breakers, or user-facing failure messages in TypeScript, Python, or Go.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#53
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas