Se estou lendo corretamente nas entrelinhas aqui, o problema é que sua exceção está efetivamente 'desaparecendo', embora o comportamento do depurador padrão seja interrompido em exceções não tratadas.
Se você tiver métodos assíncronos, pode estar enfrentando esse problema porque as exceções não detectadas em um thread do pool de threads como parte de uma continuação de tarefa não são consideradas exceções não tratadas. Em vez disso, eles são engolidos e armazenados com a Tarefa.
Por exemplo, dê uma olhada neste código:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
Se você executar este programa com as configurações padrão do depurador (parar apenas nas exceções não tratadas), o depurador não será interrompido. Isso ocorre porque o thread do pool de threads alocado para a continuação engole a exceção (passando-a para a instância Task) e se libera de volta para o pool.
Observe que, neste caso, o verdadeiro problema é que o Task
retornado por Test()
nunca é verificado. Se você tiver tipos semelhantes de lógica 'disparar e esquecer' em seu código, não verá as exceções no momento em que forem lançadas (mesmo que sejam 'não manipuladas' dentro do método); a exceção só aparece quando você observa a Tarefa esperando por ela, verificando seu Resultado ou olhando explicitamente sua Exceção.
É apenas um palpite, mas acho que provavelmente você está observando algo assim.