¿Pero dónde $%&Qñ&$ se ha producido la excepción?
Existe un truco bastante simple y útil que nos permite saber en que momento exacto se está producciendo una excepción. Me sorprende que sea desconocido por un motón de desarrolladores con los que me cruzo.
Se trata de usar la capacidad del depurador de Visual Studio para que el depurador para la ejecución cuando se produce una excepción de un tipo o tipos determinados (o de cualquier tipo si así lo queremos).
Para ello basta con utilizar el dialogo Exceptions (Excepciones) al que se puede acceder mediante la combinación de teclas Crtl + Alt + E.

Este cuadro de dialogo nos permite seleccionar que excepciones queremos que paren la ejecución de nuestro programa (lógimente si se ejecuta bajo el depurador) cuando se producen. El comportamiento por defecto es que el depurador solo salte cuando se detecta que la excepción no ha sido manejada, no el momento en que la excepción se ha producido.
En el cuadro de diálogo por defecto aparecen las excepciones de .Net Framework y de C++ habituales, pero podemos añadir nuestros propios tipos de excepciones como podéis ver en el siguiente diálogo que aparece pulsando en el botón Add... (Añadir...)
Espero que os sea útil ese pequeño truquito.