.Net uygulamalarında Unhandled Exception'lar

Merhaba,

Bu yazımda Unhandled Exception’larla ilgili birkaç önemli noktayı sizinle paylaşmak istiyorum. Eğer .net framework ‘ün kendi yönettiği WorkerThread’leri haricinde kendi başlattığınız bir thread içersinide 'unhandled exception' alırsanız bu uygulamanızı crash ettirecektir. Uygulamanızın sağlıklı bir şekilde çalışması için tüm exception'ların handle ediliyor olması önemlidir. 'unhandled exception' durumunda 'Event log'larda aşağıdaki gibi 'error event'ları görebilirsiniz:

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/1/ROOT/CustWebApp2

Process ID: 10292

Exception: System.DivideByZeroException

Message: Attempted to divide by zero.

StackTrace: at SampleApp._Default.ThreadFunc() in ...

Bu durumu örnek bir ASP.NET uygulamasında oluşturmak isterseniz; web sayfanızın Page_Load fonksiyonunda aşağıdaki gibi bir thread başlatıp bu thread içerisinde Unhandled Exception (System.DivideByZeroException) oluşturabilirsiniz. Uygulamanız bu durumda 'crash' olarak kapanacaktır:

public void ThreadFunc(){    
int i = 0;

 int j = 5 / i;}

 

 protected void Page_Load(object sender, EventArgs e){

Thread thread = new Thread(new ThreadStart(this.ThreadFunc));

thread.Start();

Fakat bu Unhandled Exception bir thread içerisinde değilde doğrudan WorkerThread içerisinde yaratılırsa bu durumda uygulamanız crash etmiyecektir:

protected void Page_Load(object sender, EventArgs e) {

int i = 0;

int j = 5 / i;

Dolayısı ile Unhandled Exception’larda bu iki tip durum için, fırlatılan Exception 'First Chance' yada 'Second Chance' Exception oluyor. Eğer Uygulama fırlatılan bir Exception’I handle ediyorsa bu Exception 'First chance' bir exception’dır. Eğer Uygulama bu Exception’I handle etmiyorsa bu ‘Second Chance' bir Exception dır. ‘Second Chance Exception’ lar process’in terminate edilmesine sebep olur. 
 

Unhandled Exception’lar için .net framework’ün çalışma mantığı 1.1 ve 1.0 versiyonunda farklıdır. Bu iki versiyon için managed bir thread içerisinde fırlatılan unhandled Exception gözardı edilir. Bundan sonraki framework versiyonları için (2.0 ve 4.0)  ise Unhandled Exception fırlatıldığında yukarıdaki gibi Process kapanır.

.Net konfigürasyonuna (machine.config) aşağıdaki şekilde ekleme yapılması, framework versiyonundan bağımsız ‘Unhandled Exception’ lar ile ilgili çalışma mekanizmasını 1.1 ve 1.0 daki haline çekecektir. Bu değişiklik bu tip durumlarda uygulamanızın kapanmasını engeller.:

<configuration>

    <runtime>

        <legacyUnhandledExceptionPolicy enabled="1" />

    </runtime>

</configuration>

2.0 ve sonraki framework versiyonlarında bu değişikliğin kaldırılmasının sebebi bunun resource leak'leri gizliyor olduğunun farkedilmesi. Uygulamanınızın daha sağlıklı çalışabilemesi için tüm exceptionlardan arındırılması önemli. Bu sebepten bu ayarı disabled olarak kullanmak daha faydalı diye düşünüyorum.

İyi çalışmalar,

Mert Öztürk