:: Read a => String -> Maybe a package:read-env-var

Just like readEnvEx, but also throw an exception when the environment variable cannot be read. This can throw both EnvVarCannotBeReadException and EnvVarDoesNotExistException with throwM. Read an environment variable that exists:
>>> setEnv "TEST_ENV_VAR" "2000"

>>> readEnvEx' "TEST_ENV_VAR" :: IO Int
2000
Try reading an environment variable that does not exist. Throws EnvVarDoesNotExistException:
>>> readEnvEx' "THIS_ENV_VAR_WILL_NOT_EXIST" :: IO Int
*** Exception: EnvVarDoesNotExistException "THIS_ENV_VAR_WILL_NOT_EXIST"
Try reading an environment variable that cannot be read. Throws EnvVarCannotBeReadException:
>>> setEnv "BAD_ENV_VAR" "not an int"

>>> readEnvEx' "BAD_ENV_VAR" :: IO Int
*** Exception: EnvVarCannotBeReadException "BAD_ENV_VAR"
Note that this DOES NOT read string values as one might expect:
>>> setEnv "TEST_ENV_VAR2" "some string 1"

>>> readEnvEx' "TEST_ENV_VAR2" :: IO String
*** Exception: EnvVarCannotBeReadException "TEST_ENV_VAR2"
It will read string values as if they were Haskell strings:
>>> setEnv "TEST_ENV_VAR3" "\"some string 1\""

>>> readEnvEx' "TEST_ENV_VAR3" :: IO String
"some string 1"
Lookup a value from an environment variable and read it in with readMaybe. Read an environment variable that exists:
>>> setEnv "TEST_ENV_VAR" "2000"

>>> readEnv "TEST_ENV_VAR" :: IO (Maybe Int)
Just 2000
Try reading an environment variable that does not exist. Returns Nothing:
>>> readEnv "THIS_ENV_VAR_WILL_NOT_EXIST" :: IO (Maybe Int)
Nothing
Try reading an environment variable that cannot be read. Returns Nothing:
>>> setEnv "BAD_ENV_VAR" "not an int"

>>> readEnv "BAD_ENV_VAR" :: IO (Maybe Int)
Nothing
Note that this DOES NOT read string values as one might expect:
>>> setEnv "TEST_ENV_VAR2" "some string 1"

>>> readEnv "TEST_ENV_VAR2" :: IO (Maybe String)
Nothing
It will read string values as if they were Haskell strings:
>>> setEnv "TEST_ENV_VAR3" "\"some string 1\""

>>> readEnv "TEST_ENV_VAR3" :: IO (Maybe String)
Just "some string 1"
Lookup a value from an environment variable and read it in with readMaybe. Throw an EnvVarDoesNotExistException if the environment variable does not exist. The exception is thrown with throwM from MonadThrow. Read an environment variable that exists:
>>> setEnv "TEST_ENV_VAR" "2000"

>>> readEnvEx "TEST_ENV_VAR" :: IO (Maybe Int)
Just 2000
Try reading an environment variable that does not exist. Throws EnvVarDoesNotExistException:
>>> readEnvEx "THIS_ENV_VAR_WILL_NOT_EXIST" :: IO (Maybe Int)
*** Exception: EnvVarDoesNotExistException "THIS_ENV_VAR_WILL_NOT_EXIST"
Try reading an environment variable that cannot be read. Returns Nothing:
>>> setEnv "BAD_ENV_VAR" "not an int"

>>> readEnvEx "BAD_ENV_VAR" :: IO (Maybe Int)
Nothing
Note that this DOES NOT read string values as one might expect:
>>> setEnv "TEST_ENV_VAR2" "some string 1"

>>> readEnvEx "TEST_ENV_VAR2" :: IO (Maybe String)
Nothing
It will read string values as if they were Haskell strings:
>>> setEnv "TEST_ENV_VAR3" "\"some string 1\""

>>> readEnvEx "TEST_ENV_VAR3" :: IO (Maybe String)
Just "some string 1"