Skip to content

orourkedd/safe-errors

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Safe Errors

In my opinion its simpler to handle errors just like I handle everything else. Normally, errors are handled on a separate codepath. This module helps normalize the codepath for the return values (including errors) from asynchronous functions.

Installation

npm i --save safe-errors

Promise Example

Normal Way

let user
try {
  user = await getUser('http://www.example.com/api/v1/users/123')
} catch (e) {
  log(e)
  //  handle error in some way
}

user.name = 'New Name'

let postResponse
try {
  postResponse = await saveUser('http://www.example.com/api/v1/users/123')
} catch (e) {
  log(e)
  //  handle error in some way
}

Safe Way

const { safep } = require('safe-errors')
let getResult = await safep(getUser)('http://www.example.com/api/v1/users/123')
if (getResult.success === false) {
  log(getResult.error)
  //  handle error in some way
}

let user = getResult.payload
user.name = 'New Name'

let saveResult = await safep(saveUser)('http://www.example.com/api/v1/users/123', user)
if (saveResult.success === false) {
  log(saveResult.error)
  //  handle error in some way
}

Even Better Safe Way

const { pipeP, merge } = require('ramda')
const { safep } = require('safe-errors')

const getUserP = () => safep(getUser)('http://www.example.com/api/v1/users/123')
const updateUser = (user) => {
  return merge(user, {
    name: 'New name'
  })
}
const saveUserP = (user) => safep(saveUser)('http://www.example.com/api/v1/users/123', user)
const handleError = (result) => {
  if (result.success === false) {
    log(result.success === false)
    // maybe return a default
    return {}
  }

  return result.payload
}

// Easier to pipe when errors are predictable
let updateAndSaveUser = pipeP(getUserP, handleError, updateUser, saveUser, handleError)
let updateResult = await updateAndSaveUser()

if (updateResult.success === false) {
  log(updateResult.error)
}

Callback Example

Normal Way

const { readFile } = require('fs')
fs.readFile('file.txt', (err, data) => {
  if (err) {
    log(err)
    //  handle error in some way
  }
  console.log(data)
})

Safe Way

const { readFile } = require('fs')
const { safecb } = require('safe-errors')

let result = await safecb(readFile)('file.txt')
if (result.error) {
  log(result.error)
  //  handle error in some way
}
console.log(result.payload) // contents of file
console.log(result.args) // array of arguments passed into done callback

About

A better way to handle errors.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages