News for hackers. Stuff that matters.
Re:C++17 and its Technical Specifications by vardump on Thursday March 03, 2016 @02:29PM (#11219329)
> Just keep away from the Google C++ style guide lines. They'll lead you very far astray.

Huh. I think Google C++ style guide makes a lot of sense. C++, the good parts.

What's wrong with the guide in your opinion?

I know a lot of people might disagree, but the common criticism of Google's C++ style, exceptions, tends to be a misfeature when you need to actually handle the errors.

It puts error handling code far from where errors occur, and where you often have the best chance to deal with it. It also obscures error sources, it's not immediately obvious in local method context just by looking at the source code which calls can throw and which not.

Exceptions also don't undo any I/O that was done, so things might be in pretty bad state -- and it tends to be pretty bad to deal with that a few method calls up.

I like errors to be on my face, even if they're "ugly". You tend to forget about hidden things.

Re:C++17 and its Technical Specifications by azov on Thursday March 03, 2016 @03:11PM (#11219644)
>It puts error handling code far from where errors occur, and where you often have the best chance to deal with it

So, you pass file name to your data access library and the file is not there. How are you going to deal with it? Write an error to the log nobody reads and call terminate()? Create a new file and let users guess what happened to the data they expected? Or return an error code?

If you picked the last option (as most people do) - well, bingo, you've just put your error handling far from where the error occurred. The only difference with throwing an exception is that now every function up the call stack needs to check that error code till it reaches the place where you can handle it or, even more likely, till someone forgets to check or chooses to ignore it. Because, unlike Go or Rust, C++ compiler won't help you there.

Error codes don't undo I/O either.

As to "which functions can throw" - let me suggest a simple rule: every function can, unless you can prove otherwise.

Look, there are situations where it makes sense to avoid exceptions, but not for the reasons you listed. Exceptions are the least evil way to handle errors in C++. Google style guide bans them mostly for historical reasons, let's not cargo cult it.

Re:C++17 and its Technical Specifications by vardump on Thursday March 03, 2016 @03:20PM (#11219702)
> So, you pass file name to your data access library and the file is not there. How are you going to deal with it? Write an error to the log nobody reads and call terminate()? Create a new file and let users guess what happened to the data they expected? Or return an error code?

Perhaps return an error code. Which the caller would check and deal with the error. (Besides, I'd be passing a stream object, not a filename.)

I/O is also network packets, graphics on the screen, motor movements.

> P.S. As to "which functions can throw" - let me suggest a simple rule: every function can, unless you can prove otherwise.

Exactly, that's the problem.

Re:C++17 and its Technical Specifications by sbmassey on Thursday March 03, 2016 @08:41PM (#11221467)
How about wrapping the return value in a templated error class that the caller has to explicitly unwrap with an error handler to be able to use?
Re:C++17 and its Technical Specifications by azov on Thursday March 03, 2016 @08:50PM (#11221514)
That will help if there is a value to return - but then it's not much better than just returning something invalid, like a NULL pointer. If the only return value is success/failure you need compiler support (1) to ensure it's not ignored.

(1) There are clever hacks to mimic this behavior to some extent, but I don't even want to go there. If you really want this feature - just use a language that has it.

Re:C++17 and its Technical Specifications by Noughmad on Thursday March 03, 2016 @02:54PM (#11219514)
You also tend to overlook/ignore the "if err != nil" in every other line, which Google seems to push. There is really no silver bullet for error handling, and sometimes you need more than one approach. However, I think exceptions are usually the best, especially because they work very well with RAII.

It would be great to have some function annotations to show which exceptions can be thrown, though. But still, keep in mind tha Google's style is pretty much equivalent to having a catch(...) after every call.

Re:C++17 and its Technical Specifications by sseagull on Thursday March 03, 2016 @03:05PM (#11219611)
>It would be great to have some function annotations to show which exceptions can be thrown, though.

There was [0]. It is deprecated and generally discouraged, since it quickly becomes a maintenance nightmare (since you have to include unhandled exceptions for all functions called from that function, etc, all the way down).

[0] http://en.cppreference.com/w/cpp/language/except_spec

Re:C++17 and its Technical Specifications by uxcn on Thursday March 03, 2016 @03:39PM (#11219859)
Exception specifications (deprecated) aren't the same as checked exceptions, which I think was what some people might have in mind. In theory, they look like they solve a number of problems, but in practice they really create more than they solve. Even Java language designers have said that checked exceptions were a mistake.

The noexcept keyword was actually added to address some of the limitations.

Re:C++17 and its Technical Specifications by Noughmad on Friday March 04, 2016 @04:25AM (#11222803)
I agree that these things get ugly very quickly. Another thing is that you aren't always catching all exceptions; for example, sometimes you are sure that something is in bounds, but the function is still declared as throws(out_of_range) or similar.

Is there a better way to do it, maybe a static analyzer or IDE warning about possible exceptions?

Re:C++17 and its Technical Specifications by uxcn on Friday March 04, 2016 @02:45PM (#11226381)
Instead of exceptions, I personally prefer using assertions to verify things like preconditions; in which case if an assertion fails the software should generally crash before getting into a worse state. Arguably, if the software shouldn't crash it's probably not an exception. Assertions can also give an analyzer a set of preconditions to check. For example, Clang's static analyzer parses assert statements [1]. I'm not sure it uses them to verify the preconditions, but regardless it's still a good way to express them.

Another way to express constraints are attributes, which static analyzers (and optimizers) also use. For example, GCC has a number of function attributes [2] to express invariants about code.

[1] http://clang-analyzer.llvm.org/scan-build.html#recommended_d...

[2] https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attribute...

Re:C++17 and its Technical Specifications by GFK_of_xmaspast on Thursday March 03, 2016 @05:04PM (#11220414)
My current least-favorite parts of the google style guide are 'don't overload operator< and std::hash, but keep them as free functions and use the other ctors for set/unordered_set/etc', because I'm thinking if you're going to have to write those things anyway, you might as well do it in a way to make the api easier.