On Tuesday, March 06, 2012 19:27:35 Andrei Alexandrescu wrote: > On 3/6/12 7:04 PM, Jonathan M Davis wrote: > > On Tuesday, March 06, 2012 18:19:23 Jose Armando Garcia wrote: > >> Fatal and Critical are exactly these continence functions... To > >> reiterate. fatal will always assert and critical will always throw. It > >> is impossible for the user to disable these things. > > > > No, because they affect the log level. The concept of throwing and the log > > level should be _completely_ separate. > > Why?
Because the level that you log something at and what you want to do in terms of exceptions aren't necessarily related at all. It could easily be that you want to log something and then do some series of operations before throwing - even if the log level is the most severe level, and you intend to throw an Error to kill the program. And as others have pointed out, you might want to log a series of messages. Having std.log throw on the first one makes it so that you can't log any others. > > std.log shouldn't be declaring _any_ > > exception types unless they're related to setting up the logging (_none_ > > which relate to functions which log). > > Why? Because as others have asserted, logging should not affect program flow. It's printing out messages to a log, which doesn't necessarily have _anything_ to do with throwing exceptions. It's merely for providing information about what the program is doing. If you have it throwing exceptions - _especially_ exceptions which are specific to it - you're conflating two separate concepts: logging to a log file and having the program report errors. They _can_ be related, but they often aren't. And when you _do_ throw an exception, why on earth would anyone want a LoggingException (or whatever std.log would call its exception type)? You want an exception which relates to what went wrong, not what threw it. The fact that you logged a message before throwing is incidental. Nothing that catches the exception is going to care. - Jonathan M Davis