После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.
Это решается путём передачи владения ресурсом полю или передачи его(владения) наружу.
В данном случае никаких противоречий не вижу. Класс изначально проектировался для соблюдения состояний:
1) Ожидает
2) В состоянии соединения
3) В состоянии ошибки
4) В состоянии передачи
Причем возможные переходы между состояниями заранее предопределены. В этом случае инвариантность не нарушается.
Допустим. ИМХО, тогда лучше воспользоваться паттерном state и управление ресурсами в этом случае будет примерно такое, как я описал. Но дело твое. В методе load в случае успеха передать владение от локального объекта полю все равно никто не мешает. Если не понятно, то могу код привести чуть позже.