I don't have an excess of C# experience, or C++ specifically, but I can tell you this - developer-written exceptions 9 out of 10 times are more useful than any generic exception you will ever find, period.
Ideally yes, a generic exception will point you to exactly why the error occurred and you'll be able to fix it with ease - but realistically, in large applications with multiple classes that can throw a wide variety of different kinds of exceptions, or the same kind of exceptions, it is always more valuable to write your own output for error return than it is to rely on the default message.
This is how it should be -, because as many people have pointed out, for security reasons some applications don't want to throw an error message that they don't want the user to see, for security reasons or to avoid confusing them.
Instead, you should anticipate in your design what types of errors might be thrown in your application (and there will always be errors) and write error-catching messages that help you identify the issue.
This won't always help you - because you can't always anticipate what error message will be useful - but it is the first step to understanding your own application better in the long-run.