Handling your logic with composable functions makes your code declarative, leading to code that's easy to read and easy to test. Breaking that up to wrap some risky function in a try/catch
block introduces imperative code and makes it harder to maintain that declarative approach. With Ramda's tryCatch
function, you can handle errors right in the middle of a composition and leave your code clean and functional. We'll also see how you can use propOr
to avoid common "cannot find X of undefined" errors.
const R = require('ramda'); const person = { id: 1, name: 'Joe' }; /* * The problem for this code: * R.prop('name') assume that the object passed in has 'name' prop * But what if the object is undefined? Then we will get error. * * Solution: R.tryCatch() * */ /* const getPersonName = R.prop('name'); const getUpperCaseName = R.pipe( getPersonName, R.toUpper ); const res = getUpperCaseName(person); // ERROR */ const getPersonName = R.tryCatch(R.prop('name'), R.always('Default')); const getUpperCaseName = R.pipe( getPersonName, R.toUpper ); const res = getUpperCaseName(undefined); // DEFAULT console.log(res);