On December 24, 2017 9:54 AM, Jeff King wrote: > Subject: Re: Improved error handling (Was: [PATCH 1/2] sequencer: factor > out rewrite_file()) > > On Sat, Nov 18, 2017 at 10:01:45AM +0100, Johannes Sixt wrote: > > > > Yeah, I have mixed feelings on that. I think it does make the > > > control flow less clear. At the same time, what I found was that > > > handlers like die/ignore/warn were the thing that gave the most > > > reduction in complexity in the callers. > > > > Would you not consider switching over to C++? With exceptions, you get > > the error context without cluttering the API. (Did I mention that > > librarification would become a breeze? Do not die in library routines: > > not a problem anymore, just catch the exception. die_on_error > > parameters? Not needed anymore. Not to mention that resource leaks > > would be much, MUCH simpler to treat.) > > I threw this email on my todo pile since I was traveling when it came, but I > think it deserves a response (albeit quite late). > > It's been a long while since I've done any serious C++, but I did really like the > RAII pattern coupled with exceptions. That said, I think it's dangerous to do it > half-way, and especially to retrofit an existing code base. It introduces a > whole new control-flow pattern that is invisible to the existing code, so > you're going to get leaks and variables in unexpected states whenever you > see an exception. > > I also suspect there'd be a fair bit of in converting the existing code to > something that actually compiles as C++. > > So if we were starting the project from scratch and thinking about using > C++ with RAII and exceptions, sure, that's something I'd entertain[1] > (and maybe even Linus has softened on his opinion of C++ these days ;) ). > But at this point, it doesn't seem like the tradeoff for switching is there. While I'm a huge fan of OO, you really need a solid justification for going there, and a good study of your target audience for Open Source C++. My comments are based on porting experience outside of Linux/Windows: 1. Conversion to C++ just to pick up exceptions is a lot like "One does not simply walk to Mordor", as Peff hinted at above. 2. Moving to C++ generally involves a **complete** redesign. While Command Patterns (and and...) may be very helpful in one level, the current git code base is very procedural in nature. 3. From a porting perspective, applications written in with C++ generally (there are exceptions) are significantly harder than C. The POSIX APIs are older and more broadly supported/emulated than what is available in C++. Once you start getting into "my favourite C++ library is...", or "version2 or version3", or smart pointers vs. scope allocation, things get pretty argumentative. It is (arguably) much easier to disable a section of code that won't function on a platform in C without having to rework an OO model, making subsequent merges pretty much impossible and the port unsustainable. That is unless the overall design really factors in platform differences right into the OO model from the beginning of incubation. 4. I really hate making these points because I am an OO "fanspert", just not when doing portable code. Even in java, which is more port-stable than C++ (arguably, but in my experience), you tend to hit platform library differences than can invalidate ports. My take is "oh my please don't go there" for the git project, for a component that has become/is becoming required core infrastructure for so many platforms. With Respect, Randall -- Brief whoami: NonStop&UNIX developer since approximately UNIX(421664400)/NonStop(211288444200000000) -- In my real life, I talk too much.