Am 23.02.2012 01:07, schrieb Evan Laforge:
> On Wed, Feb 22, 2012 at 3:51 PM, John Meacham<john at repetae.net> wrote:
>> On Wed, Feb 22, 2012 at 3:05 PM, Evan Laforge<qdunkan at gmail.com> wrote:
>>> It's awkward and surprising how getEnv throws an exception when an env
>>> var is not set, since it's very common for env vars to be optional,
>>> and it's not convenient to catch exceptions in haskell (I have to look
>>> up Control.Exception every time, and then add LANGUAGE
>>>> For true IO exceptions, you should be using the Prelude.catch mechanism.
>> It's the right thing to do and makes your program more portable as a bonus.
>> It is quite unfortunate that IO exceptions became conflated with imprecise
>> and dynamic exceptions and clash in their names. They really are different
>> beasts alltogether.
>> Good point, I had forgotten about the Prelude catch. I think I can go
> remove a bunch of ScopedTypedVariables now.
This situation is particularly annoying since hlint (1.8.24) always says:
... Error: Use Control.Exception.catch
Found:
catch
Why not:
Control.Exception.catch
Note: Prelude.catch does not catch most exceptions
And now I learn that Prelude.catch is the right version for i.e. file IO
(so I should probably switch off that hlint "Error").
Regarding the actual proposal, I fully agree. I always use a wrapper
based on getEnvironment.
getEnvSave :: a -- ^ default value
-> String -- ^ name of environment variable
-> (String -> Maybe a) -- ^ parse and check value
-> IO a
getEnvSave defValue envVar readFun =
liftM (maybe defValue (fromMaybe defValue . readFun)
. lookup envVar) getEnvironment
Cheers Christian
> The ghc exception situation is a bit messy, and I never have all the
> distinctions quite memorized, but it's also because I hardly ever have
> to deal with exceptions (of the "magical return value" variety, I use
> Either and Maybe all the time), unlike certain other languages. And
> that's a very good thing!
>> If I forget the rest about exceptions due to lack of use, I should at
> least remember that IO exceptions are different from, and better
> behaved than, the imprecise ones.