Cualquier excepción que se genere en la expresión de inicialización de la instrucción using propagará el alcance del método y la pila de llamadas como se espera.
Sin embargo, una cosa a tener en cuenta es que si se produce una excepción en la expresión de inicialización, no se invocará el método Dispose() en la variable de expresión. Este es casi siempre el comportamiento que desea, ya que no desea molestarse en deshacerse de un objeto que en realidad no se creó. Sin embargo, podría haber un problema en circunstancias complejas. Es decir, si las inicializaciones múltiples están ocultas dentro del constructor y algunas tienen éxito antes de que se genere la excepción, entonces la llamada Dispose no puede ocurrir en ese punto. Sin embargo, esto no suele ser un problema, ya que los constructores generalmente se mantienen simples.
Estoy bastante seguro de que su "gotcha" no es precisa. Como la clase StreamReader implementa IDisposable, la sentencia using se ocupará de la eliminación del objeto. Debido a que la instrucción using actúa como un bloque finally, no importa si tiene una excepción o devolución. –
De acuerdo con http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx, las instrucciones catch y finally se siguen ejecutando. Como "using" compila como un bloque finally, el lector de stread en su ejemplo será eliminado. – Uhall
Estoy de acuerdo con los dos comentarios anteriores. Además del comentario de @ Uhall anterior, ThreadAbortException no aborta el hilo, solo atrapa la excepción que se genera como resultado. –