Если класс реализует интерфейс, как он должен обрабатывать ситуации, когда либо
BTW, один шаблон, который я не видел, реализовал, но, казалось бы, был бы полезен, было бы для методов принимать параметр делегата, который должен выполняться, в случае, если метод завершился неудачно, что приведет к тому, что метод "try" вернет false, Такой делегат, предоставленный вызывающим, мог тогда не только генерировать исключение, которое должен знать получатель, но также может установить флаг, который в противном случае был доступен только вызывающему. Таким образом, вызывающий может знать, что исключение, которое было поймано, действительно было ожидаемым.
Задача интерфейса заключается в определении членов (и их подписи), которые должен иметь класс, а не как их реализовать. Поэтому я бы сказал, пусть исключение пузырится вверх по стеку. Если вы действительно хотите определить контракт и контролировать некоторую реализацию (например, обработку ошибок), тогда вы должны сделать базовый класс (в этой ситуации я бы склонялся к классу MustInherit/Abstract) с помощью методов MustOverride, которые вызвал базовый класс из его методы (в вашей ситуации в Try Catch, чтобы вы могли выполнять специальную обработку ошибок).