This project has been moved to safe-std.
A lightweight, low overhead errors-as-values API.
Return errors:
import { st } from 'safe-throw';
const divide = (a: number, b: number) =>
  b === 0 ? st.err('Cannot divide by 0') : a / b;
const res = divide(9, Math.random());
if (st.isErr(res)) {
  console.error(st.payload(res));
} else {
  // No unwrapping needed for result
  console.log(res);
}Wrapping fetch calls:
import { st } from 'safe-throw';
// Wrap fetch error in a native error instance
const safeFetch = st.asyncTry(fetch);
const res = await safeFetch('http://example.com');
if (st.isErr(res)) {
  // Get the error payload
  const err = st.payload(res);
  console.error(err);
} else {
  // Use response normally
  console.log(await res.text());
}Handling promise errors:
import { st } from 'safe-throw';
const res = await st.promiseTry(
  fetch('http://localhost:3000')
);
if (st.isErr(res)) {
  // Get the error payload
  const err = st.payload(res);
  console.error(err);
} else {
  // Use response normally
  console.log(await res.text());
}Create tagged errors:
import { st } from 'safe-throw';
const httpErr = st.taggedErr('http');
const fn = () => {
  const n1 = Math.random(),
    n2 = Math.random();
  if (n1 < 0.5)
    return httpErr('random');
  if (n2 < 0.5)
    return st.err('the generated number is too small');
  return n1 + n2;
}
const res = fn();
if (st.isErr(res)) {
  if (st.taggedWith('http', res)) {
    // Handle http error
  } else {
    // Handle untagged errors
  }
} else {
  console.log(res);
}Match different error tags:
import { st } from 'safe-throw';
const httpErr = st.taggedErr('http');
const validationErr = st.taggedErr('validation');
const fn = () => {
  const n1 = Math.random(),
    n2 = Math.random();
  if (n1 < 0.5)
    return httpErr('random');
  if (n2 < 0.5)
    return st.err('the generated number is too small');
  const sum = n1 + n2;
  return sum < 0.15
    ? validationErr('sum of two generated numbers is too small')
    : sum;
}
const res = fn();
if (st.isErr(res)) {
  if (st.tagged(res)) {
    // Match tags
    switch (st.tag(res)) {
      case 'http':
        // Handle http error
        break;
      case 'validation':
        // Handle validation error
        break;
    }
  } else {
    // Handle untagged errors
  }
} else {
  console.log(res);
}