Tag Archives: catches

Workflow Foundation ile Exception Handling

Bu yazıda Workflow Foundation ile Kopyalanarak Çoğaltılan Aktiviteler yazımızda yaptığımız satış uygulamasına ek olarak bu sefer eğer ürünümüz stokta yoksa workflow tarafından yakalanacak olan bir exception fırlatacağız.

Visual Studio’yu açıp yeni bir Blank solution oluşturalım. İsmini de “Exception Handling” olarak ayarlayalım.

WF-BlankSolution

Workflow Foundation ile Kopyalanarak Çoğaltılan Aktiviteler yazımızda oluşturduğumuz projenin altındaki Siparisİslemi klasörünü Exception Handling klasörünün altına kopyalayalım. Daha sonra da Solution Explorer kısmından Add->Existing Project diyerek Exception Handling klasörünün altındakiSiparisİslemi klasörü içinde bulunan Siparisİslemi.csproj dosyasını seçelim.

Şimdi SiparisWF.xaml dosyamızı dizayn modunda açalım. “Kullanım Ücreti” switch aktivitesinin altına bir TryCatch aktivitesi sürükleyip bırakalım. DisplayName özelliğini “Stok Kontrolü” olarak atayalım.

TryCatch aktivitesi üç kısımdan oluşmaktadır. Try kısmında, potansiyel olarak bir exception üretebilecek aktiviteler yer alır. Catches kısmında, bir veya daha fazla Catch nesnesi tanımlayabiliriz. Her Catch nesnesi belirli bir exception işler. Finally kısmı opsiyoneldir. Try aktivitesinden sonra işleyeceğimiz aktiviteler varsa bu aktiviteleri bu kısımda işleyebiliriz.

Şimdi bir ürünün stokta olmayışı durumudan kullanacağımız exception’ı tanımlamaya başlayabiliriz. Siparis.cs dosyamızı açalım ve bir StoktaYokException (isim biraz saçma evet) sınıfı yaratalım. Siparis sınıfından sonra aşağıdaki kodlarımızı yazalım. (Yazdığımız kodun Siparisİslemi namespace’i içinde olmasına dikkat edelim.)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities.Expressions;
using System.Activities.Statements;

namespace Siparisİslemi
{
public class SiparisOge
{
public int SiparisOgeID { get; set; }
public int Miktar { get; set; }
public string OgeID { get; set; }
public string Tanım { get; set; }
}

public class Siparis
{
public Siparis()
{
Ogeler = new List<SiparisOge>();
}
public int SiparisID { get; set; }
public string Tanım { get; set; }
public decimal ToplamAgirlik { get; set; }
public string SiparisMetodu { get; set; }

public List<SiparisOge> Ogeler { get; set; }
}

//---------------------------------------------
// Eğer bir ürün stokta yoksa oluşacak exception durumunu tanımlama
//---------------------------------------------

public class StoktaYokException : Exception
{
public StoktaYokException()
: base()
{
}

public StoktaYokException(string mesaj)
: base(mesaj)
{
}
}
}

Try kısmına bir ForEach aktivitesi sürükleyip bırakalım. DisplayName özelliğine “Her Ürünü Kontrol Et” olarak atayalım. Expression özelliğine de SiparisBilgisi.Ogeler ifadesini yazalım. TypeArgument özelliğine de Browse for Types diyerek Siparisİslemi.SiparisOge olarak atayalım.

Bu ForEach aktivitesi içine bir If aktivitesi ekleyelim. DisplayName özelliğini “Eğer Stokta Yoksa” olarak atayalım. Condition kısmına item.OgeID = “12346” ifadesini yazalım. Bu işlemin ardından Then kısmına bir Throw aktivitesi sürükleyelim. Bu Throw aktivitesinin Exception özelliğine aşağıdaki ifademizi yazalım:


New Siparisİslemi.StoktaYokException("Ürün Kodu: " + item.OgeID)

Bu ifade kısaca yeni bir StoktaYokException oluşturur ve parametre olarak aldığı mesajda hangi ürün stokta kalmadıysa onun kodunu gösterir.

Catches kısmından “Add new catch” linkine tıklayalım. Karşımıza genel olarak tanımlanan exception’ların bir listesi drop-down olarak görülecektir. Browse for Types diyerek Siparisİslemi.StoktaYokException istisna durumunu seçelim.

WF-Catch

Yakaladığımız her exception durumu için, çalışabileceğimiz bir aktivite tanımlamaya ihtiyacımız olacaktır. Catches kısmının içine bir Writeline aktivitesi ekleyelim ve Text özelliğine

“Ürün stokta yok – ” + exception.Message

ifadesini ekleyelim. Bu kod Exception’dan gelen (stokta olmayan) ürün kodunu içeren mesajı ifade eder. “Stok Kontrolü” aktivitesinin son hali aşağıdaki şekilde gözükmelidir derleyicimizde;

WF-TryCatch

Burada Try bölümü “Her Ürünü Kontrol Et” adında bir aktivite olduğunu gösterir bize. Catches kısmında bize yakalacağımız istisna durumlarını belirtir. Ki burada sadece bir adet istisna durumumuz (StoktaYokException) olduğunu ve bunu bir Writeline aktivitesi ile belirttiğimizi görürüz.

Şimdi projemizi F5 ile çalıştıralım.

Sipariş Alındı
Ürün Toplamı: 60
Ürün stokta yok – Ürün Kodu: 12346
Toplam Maliyet: 120,0
Workflow’un döndürdüğü Toplam Maliyet 120,0
Enter to Exit