I like to work on open source projects in my free time and thus have created a few JavaScript modules in the past. Most of the times, they're like really small libraries and only serve one purpose. As the main point about a library is being used somewhere else, it is quite likely that somewhere else will be somebody else's code, codebase, project, you name it. As such, it's of course very important to document your API (which I always try my best at, I swear! 😄). Still though, there's this one question I regularly have when creating a library API:
What if something goes wrong?
Let's think of a scenario here to illustrate my problem. Recently, I've been working on a little JS library that takes a string with a time and timezone, and gives back an object providing converted versions for UTC and local time. The usage looks like this:
import tizo from 'tizo';
tizo("19:30 cest").utc;
// → '[ 17, 30 ]'
As you can see, in the above example the timezone cest
was provided. What I've been thinking of was, what if the timezone that is passed to the library does not exist? Be it because it actually doesn't exist, or tizo
doesn't know about it.
The two ways I see here are:
- a "hard error", clearly interrupting execution, for example via Promise rejection, error throwing or
process.exit(1)
- a "soft error", doing your best regardless, for example giving back a string stating the error, ignoring the parameter in question and work with default values, etc
What do you think? Lemme know!
Throw or reject, all the way. Libraries generally shouldn't control the process, but the other mechanisms you've identified for surfacing "hard errors" are the standard. It's on the consumer to ensure that they account for exceptional behavior where it's possible for it to occur, especially where that depends on input from the consumer.
Returning a string message is a non-standard and therefore inferior variation on proper exception raising. Ignoring or second-guessing invalid input is the stuff of which nightmares are made. Imagine somebody using your timezone code to manage flight schedules: a time and invalid timezone come in from, say, Chongqing, you've decided to ignore invalid timezones, the code returns a "UTC" time that's actually eight hours ahead, that makes it into a central database, and suddenly air traffic control's day is a lot more interesting.