Где-то всё равно выбор придётся делать.
1) Можно сделать своё исключение, наследуемое от System.Exception и заворачивать внутрь исключение, которое выбросилось
2) Сообщение об ошибке можно передавать в теле исключения (message)
try
{
///
}
catch(InvalidOperationException ex)
{
throw new MyCustomException("Случилось страшное", ex);
}
catch(DataException ex)
{
throw new MyCustomException("Не менее страшное", ex);
}
catch (Exception ex)
{
throw new MyCustomException("Тут вообще хз что произошло", ex);
}
При этом, первоначальное исключение будет в свойстве InnerException