try tipos propiedades las lanzar excepciones excepcion errores ejemplo definicion como catch capturar c# .net

c# - tipos - ¿Por qué usar try{} finalmente{} con un bloque try vacío?



try catch c# ejemplo (2)

De http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/ :

Esta metodología protege contra una llamada Thread.Abort que interrumpe el procesamiento. La página de MSDN de Thread.Abort dice que "los bloques no ejecutados finalmente se ejecutan antes de abortar el hilo". Por lo tanto, para garantizar que su procesamiento finalice incluso si alguien interrumpe el subproceso en el medio, puede colocar todo el código en el bloque final (la alternativa es escribir el código en el bloque "captura" para determine dónde estaba antes de que "interrumpir" se interrumpiera por Abortar y prosiga desde allí si quiere).

Noté que en System.Threading.TimerBase.Dipose() el método tiene un bloque try{} finally{} pero el try{} está vacío.

¿Hay algún valor en usar try{} finally{} con un try vacío?

http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Threading&type=TimerBase

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal bool Dispose(WaitHandle notifyObject) { bool status = false; bool bLockTaken = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { do { if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) { bLockTaken = true; try { status = DeleteTimerNative(notifyObject.SafeWaitHandle); } finally { m_lock = 0; } } Thread.SpinWait(1); // yield to processor } while (!bLockTaken); GC.SuppressFinalize(this); } return status; }


Esto es para evitar que Thread.Abort interrumpa un proceso. Documentation para este método dice que:

Los bloques no ejecutados finalmente se ejecutan antes de abortar el hilo.

Esto se debe a que para recuperarse exitosamente de un error, su código tendrá que limpiarse después de él. Como C # no tiene destructores de estilo C ++, finally , y el using bloques es la única forma confiable de garantizar que dicha limpieza se realice de manera confiable. Recuerda que using bloque se convierte en esto por el compilador:

try { ... } finally { if(obj != null) ((IDisposable)obj).Dispose(); }

En .NET 1.x, había una posibilidad de que finally bloque se abortara. Este comportamiento fue cambiado en .NET 2.0.

Además, el compilador nunca optimiza los bloques de try vacíos.