Skip to content

Tratamento de Erros

Classes de Erro Disponiveis

Todas as classes de erro sao exportadas individualmente para tree-shaking. Para detalhes sobre cada codigo de status, veja a Referencia de Status HTTP do MDN.

Erros de Cliente (4xx)

ClassStatusStatus Text
BadRequestError400Bad Request
UnauthorizedError401Unauthorized
PaymentRequiredError402Payment Required
ForbiddenError403Forbidden
NotFoundError404Not Found
MethodNotAllowedError405Method Not Allowed
NotAcceptableError406Not Acceptable
ProxyAuthenticationRequiredError407Proxy Authentication Required
RequestTimeoutError408Request Timeout
ConflictError409Conflict
GoneError410Gone
LengthRequiredError411Length Required
PreconditionFailedError412Precondition Failed
RequestTooLongError413Payload Too Large
RequestUriTooLongError414URI Too Long
UnsupportedMediaTypeError415Unsupported Media Type
RequestedRangeNotSatisfiableError416Range Not Satisfiable
ExpectationFailedError417Expectation Failed
ImATeapotError418I'm a teapot
MisdirectedRequestError421Misdirected Request
UnprocessableEntityError422Unprocessable Entity
LockedError423Locked
FailedDependencyError424Failed Dependency
TooEarlyError425Too Early
UpgradeRequiredError426Upgrade Required
PreconditionRequiredError428Precondition Required
TooManyRequestsError429Too Many Requests
RequestHeaderFieldsTooLargeError431Request Header Fields Too Large
UnavailableForLegalReasonsError451Unavailable For Legal Reasons

Erros de Servidor (5xx)

ClassStatusStatus Text
InternalServerError500Internal Server Error
NotImplementedError501Not Implemented
BadGatewayError502Bad Gateway
ServiceUnavailableError503Service Unavailable
GatewayTimeoutError504Gateway Timeout
HttpVersionNotSupportedError505HTTP Version Not Supported
VariantAlsoNegotiatesError506Variant Also Negotiates
InsufficientStorageError507Insufficient Storage
LoopDetectedError508Loop Detected
NotExtendedError510Not Extended
NetworkAuthenticationRequiredError511Network Authentication Required

Erros de Rede

ClassDescricao
NetworkErrorConexao recusada, falhas de DNS, timeouts

Tratando Erros com instanceof

typescript
import { typedFetch, NotFoundError, UnauthorizedError, NetworkError } from '@pbpeterson/typed-fetch';

type ExpectedErrors = NotFoundError | UnauthorizedError;
const { response, error } = await typedFetch<User, ExpectedErrors>('/api/users/123');

if (error) {
  if (error instanceof NotFoundError) {
    console.log('User not found');
    const details = await error.json<{ message: string }>();
  } else if (error instanceof UnauthorizedError) {
    console.log('Please log in');
  } else if (error instanceof NetworkError) {
    console.log('Network error:', error.message);
  } else {
    // Server errors (5xx)
    console.log('Server error:', error.statusText);
  }
}

Tratando Erros com Type Guards

typescript
import { typedFetch, isHttpError, isNetworkError } from '@pbpeterson/typed-fetch';

const { error } = await typedFetch<User>('/api/users/123');

if (error) {
  if (isHttpError(error)) {
    // error e restringido para BaseHttpError
    console.log(`${error.name}: ${error.status} ${error.statusText}`);
    const body = await error.json();
  } else if (isNetworkError(error)) {
    // error e restringido para NetworkError
    console.log('Connection failed:', error.message);
  }
}

Corpos de Erro Tipados

O metodo json<T>() aceita um parametro de tipo para tipar o corpo da resposta de erro:

typescript
interface ApiError {
  message: string;
  code: string;
  fields?: Record<string, string>;
}

if (error instanceof BadRequestError) {
  const details = await error.json<ApiError>();
  console.log(details.message); // typed as string
  console.log(details.fields);  // typed as Record<string, string> | undefined
}

Propriedades Estaticas

Acesse codigos de status sem criar instancias:

typescript
import { NotFoundError, BadRequestError } from '@pbpeterson/typed-fetch';

console.log(NotFoundError.status);      // 404 (literal type)
console.log(NotFoundError.statusText);  // "Not Found" (literal type)
console.log(BadRequestError.status);    // 400

Lançado sob a Licença MIT.