Бросать исключения из конструктора должно быть хорошо, если вы не создали неуправляемых ресурсов. Однако, если вы создаете неуправляемые ресурсы в конструкторе, все тело этого конструктора, включая throw, должно быть заключено в try / catch Чтобы украсть отличный пример JaredPar:
public class Foo : IDisposable {
private IntPtr m_ptr;
public Foo() {
try
{
m_ptr = Marshal.AllocHGlobal(42);
throw new Exception();
}
catch
{
Dispose();
throw;
}
}
// Most of Idisposable implementation ommitted for brevity
public void Dispose() {
Marshal.FreeHGlobal(m_ptr);
}
}
Теперь будет работать следующее:
using ( var f = new Foo() ) {
// Won't execute, but Foo still cleans itself up
}