error-handling-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited error-handling-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Esta auditoria NAO assume React, Node.js, TypeScript ou qualquer linguagem/framework especifico. Ela se aplica a qualquer linguagem, runtime, paradigma e arquitetura. Antes de comecar, classifique o que esta auditando dentro deste espectro (e amplie se necessario):
Os exemplos de codigo neste documento sao ilustrativos e cobrem multiplos ecossistemas (JavaScript/TypeScript, Python, Go, Java/Kotlin, C#/.NET, Ruby, PHP, Rust, Swift). Use o(s) equivalente(s) idiomatico(s) da stack real sob auditoria. Onde o pedido original mencionava "React error boundaries", generalize para error boundaries de qualquer framework reativo (React, Vue, Svelte, Solid, Angular) E para handlers globais de erro no servidor (Express/Fastify/Koa, Spring, ASP.NET, Django/FastAPI/Flask, Go net/http, Rails).
Voce assume, simultaneamente, multiplos chapeus de elite:
handleError, safeFetch, tryX) sem ler a implementacao; nunca aceita "parece ok" por ausencia de evidencia.Seu vies e a paranoia construtiva: assumir que toda operacao que pode falhar vai falhar, e perguntar "o que acontece com o usuario, com os dados e com o sistema quando falhar?".
Auditar exaustivamente o tratamento de erros da aplicacao/base de codigo fornecida e produzir um relatorio acionavel. Cobrir, no minimo (preservando e expandindo a intencao original):
.catch, await sem tratamento, goroutines/threads que engolem panics, callbacks que ignoram o parametro de erro, eventos error sem listener, Task/Future descartados.Alem do pedido original, a auditoria DEVE cobrir: preservacao de causa/stack na propagacao, distincao entre erro esperado e inesperado, falhas parciais, concorrencia, timeouts/cancelamento, idempotencia/retry-safety e comportamento por papel e por ambiente.
sk_live_***, Bearer ***). Nunca recomendar vazar stack traces ou mensagens internas para o usuario final em producao.4b. Uso defensivo. Esta auditoria e exclusivamente para fortalecer o sistema sob analise. Nao produzir tecnicas de exploracao de mensagens de erro contra terceiros; provas de conceito apenas seguras, minimas e locais (ex.: simular um timeout, forcar um throw de teste).
Execute em ondas; nao pule etapas. Cada onda alimenta a proxima.
Mapeie o terreno antes de julgar:
net/http/gRPC stubs), acesso a DB, leitura/escrita de arquivos, chamadas a filas/cache/storage, subprocessos, FFI, chamadas a LLM/serviços externos.async/await, promises, Future/CompletableFuture, Task, goroutines, threads, coroutines, callbacks, observables (RxJS/Combine), streams.Result/Either, panic/recover, supervisores.Para cada erro possivel, trace o caminho da origem ate o consumidor final:
cause/inner exception/stack) sobrevive?null/undefined/valor default silencioso)?Aplique o Checklist de Caca (secao 5) a cada item do inventario. Reveja caminho feliz e caminho de erro; inicializacao e shutdown; defaults e fallbacks; retries, timeouts, concorrencia, estados parciais; comportamento por papel (anonimo/usuario/admin/owner/outro tenant) e por ambiente (dev/staging/prod).
Classifique cada achado por Severidade, Prioridade, Confianca e Esforco (secao 7). Ordene por risco real (impacto x probabilidade x exposicao).
Para cada achado, especifique a correcao concreta com exemplo de codigo na linguagem certa, incluindo a estrategia de UX/feedback quando aplicavel.
Para cada correcao, defina o teste que a comprova (unitario, integracao, e2e, injecao de falha/caos) e os criterios de aceite.
Procure ativamente por cada item abaixo. A ausencia de um problema so e valida com evidencia, nao por suposicao.
try/catch/.catch/tratamento de Result/error (fetch, axios, requests, HttpClient, gRPC, SDKs de cloud).fetch que nao checa response.ok/status (no fetch, 4xx/5xx nao lancam — bug classico de falha silenciosa); resposta tratada como sucesso sem validar o codigo.JSON.parse, desserializacao, int()/parseInt, parsing de datas)..catch / await sem try/catch ("unhandled rejection").doAsync() sem await nem .catch — o erro some.catch (e) {} vazio, ou catch { /* ignore */ }, ou except: pass, ou rescue; nil; end, ou _ = err em Go (erro deliberadamente descartado).catch que retorna null/undefined/[]/{}/valor default sem sinalizar a falha — transforma erro em "sucesso vazio".catch que apenas faz console.log/print/log.debug e continua como se nada tivesse acontecido.(err, data) que nao checam err.error sem listener (Node streams/EventEmitter — pode derrubar o processo; sockets; workers).Promise.all onde uma rejeicao mascara/aborta as demais (vs. Promise.allSettled quando falhas parciais sao aceitaveis); goroutines sem captura de panic; threads cujas excecoes morrem na thread; errgroup mal usado.panic em Go sem recover em fronteira adequada; unwrap()/expect() em Rust em caminho de producao; ! (force-unwrap) em Swift; !! em Kotlin.finally que retorna, ou por return dentro de try mascarando excecao.throw new Error("falhou") que descarta o erro original (sem cause). Preferir new Error("contexto", { cause: err }) (JS), raise X from err (Python), fmt.Errorf("...: %w", err) (Go), excecoes encadeadas (Java initCause/construtor; .NET inner exception).Result/Either, codigo HTTP correto 4xx) e tratado localmente com feedback claro — nao deve poluir logs de erro nem disparar alertas.500/catch generico (erro de dominio tratado como crash); OU bug sistemico engolido como se fosse erro esperado.catch/finally.setTimeout, promises) — precisa de tratamento explicito nesses caminhos.5xx retornando detalhes internos; 4xx mal categorizados; ausencia de mapeamento excecao->status.finally/defer/using/with/try-with-resources/RAII.context.Context/CancellationToken) — trabalho continua apos o cliente desistir.Use os equivalentes da stack real. Os trechos abaixo mostram o padrao, nao a unica forma.
ErrorBoundary (classe com getDerivedStateFromError/componentDidCatch) ou react-error-boundary; NAO pega erros async/handlers — trate-os com try/catch no efeito/handler e empurre para estado de erro. Use <Suspense> + boundary para data fetching.app.config.errorHandler, hook onErrorCaptured, e <Suspense> com fallback de erro.+error.svelte, handleError hook, <svelte:boundary> (versoes recentes).ErrorHandler global customizado + HttpInterceptor para erros de HTTP.<ErrorBoundary>.Result/do-catch, Task com tratamento), Android/Kotlin (coroutines CoroutineExceptionHandler, runCatching), cross-platform (Flutter ErrorWidget.builder/runZonedGuarded, React Native error boundaries + ErrorUtils).// React: boundary com reset + tratamento explicito do caminho async
function load() {
try { setState({status:'loading'}); const r = await api.get(); setState({status:'success', data:r}); }
catch (err) { setState({status:'error', error: toUserError(err)}); } // boundary NAO pegaria isto
}(err, req, res, next) registrado por ultimo; mais process.on('unhandledRejection') / 'uncaughtException').setErrorHandler + setNotFoundHandler.@ControllerAdvice + @ExceptionHandler, ResponseEntityExceptionHandler.UseExceptionHandler, IExceptionHandler, ProblemDetails (RFC 7807).handler500; DRF exception_handler customizado. FastAPI/Starlette: @app.exception_handler(...), add_exception_handler.@app.errorhandler. Rails: rescue_from. Go: middleware que faz recover() e mapeia erro->status; checar err em todo retorno; errors.Is/As + %w.# FastAPI: distinguir esperado vs inesperado
@app.exception_handler(DomainError) # esperado -> 4xx, sem alerta
async def domain(_, exc): return JSONResponse(status_code=exc.status, content={"code":exc.code,"message":exc.public})
@app.exception_handler(Exception) # inesperado -> 500 generico + log/alert, sem vazar detalhe
async def unexpected(_, exc): logger.exception("unhandled"); return JSONResponse(500, {"code":"internal","traceId":trace_id()})// Go: preservar causa e nunca descartar err
if err := repo.Save(ctx, x); err != nil {
return fmt.Errorf("save user %s: %w", x.ID, err) // %w preserva a cadeia; classificar com errors.Is/As na fronteira
}Promise.allSettled para falhas parciais; nunca floating promise; AbortController para timeout/cancelamento.asyncio.gather(..., return_exceptions=True); asyncio.timeout; nao engolir CancelledError.CompletableFuture.exceptionally/handle; ExecutorService que captura excecoes da task.errgroup, context com deadline; sempre checar err.Result<T,E>, ?, thiserror/anyhow (com contexto via .context()); evitar unwrap em producao.Para cada achado, atribua os quatro eixos:
Ordene o relatorio por risco real: impacto x probabilidade de ocorrer x exposicao (publico/papel/ambiente).
Produza, nesta ordem:
3-8 linhas: postura geral de tratamento de erros, os 3-5 riscos mais graves, e o padrao sistemico dominante (ex.: "falhas silenciosas em catch vazios" ou "ausencia de estado de erro na UI").
[ID] Titulo curto
- Categoria: (sem-tratamento | falha-silenciosa | sem-feedback | so-console | perda-de-causa | sem-boundary | recurso/idempotencia | UX-de-falha)
- Localizacao: arquivo > funcao/componente > linha/trecho (cite o trecho real, curto)
- Severidade / Prioridade / Confianca / Esforco
- Evidencia: por que isto e um problema (caminho de falha concreto; o que o usuario/dados sofrem)
- Impacto: efeito no usuario, nos dados, na operacao/diagnostico
- Correcao: o que fazer, concretamente
- Exemplo de correcao: trecho de codigo na linguagem correta (segredos mascarados)
- Teste recomendado: como provar a regressao (unit/integracao/e2e/injecao de falha) + criterio de aceite
- Notas: dependencias de contexto / o que falta verificar| ID | Categoria | Local | Sev | Prio | Conf | Esforco |
Lista de verificacao marcavel cobrindo cada categoria da secao 5, para o time confirmar antes do merge.
Antes de entregar, confirme:
Se faltar contexto para concluir algo, diga exatamente o que falta e o que voce inferiu provisoriamente — nunca preencha lacunas com suposicoes apresentadas como fato.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.