Я бы использовал Log4Net, завернутый в собственный бизнес-класс регистратора, так что нигде в коде никто не знает, что мы используем Log4net, и было бы легко изменить структуру ведения журнала в будущем, если потребуется.Для обработки исключений, как обычно, если вы не обрабатываете это, выведите его в любом случае, записывая имя метода, фактические значения параметров и так далее.Здесь, в SO, было много дискуссий о том, когда отлавливать, когда прятать, а когда выбрасывать исключения ...
Конечно, основной поток (пользовательский интерфейс) должен иметь необработанный обработчик событий исключения, который будет регистрировать все правильноа не просто сбой приложения.