Если, как вы упомянули выше, ошибка в коде делегата, поместите туда try-catch и зарегистрируйте исключение. В качестве альтернативы, если вы хотите, чтобы это исключение было передано обратно в исходный поток, используйте асинхронный делегат (вызов EndInvoke повторно вызовет исключение для вызывающего потока или использование фонового работника и подпишется на событие RunWorkerCompleted (это имеет свойство error в аргументах события) .