This rule is best read: Do not handle Exceptions that you do not know how to handle it!
If, for example, you write a class that reads a CSV file and returns line markers, you will have several points in your class where an IOException may be thrown. You definitely will not catch him, because it is not your responsibility to handle this! Your task is to convert the byte stream to the token stream, nothing more. If someone sends you a corrupt stream, this should be handled by him, not by you.
EDIT . One more example. If your library, for example, reaches a SocketException and the socket was passed to lib from the caller, then throw a SocketException. If your library is an abstract connection structure that can also connect to files, memory, etc., and SocketExceptions are not shared, wrap them in ConnectionException.