The point of having custom exception types is to convey more information than is available in standard types. But custom exception types must be `public` for that to work.
If a method throws a non-public exception, the best you can do on the caller's side is to `catch` the closest `public` base of the class. However, you lose all the information that the new exception type carries.