• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Asp.Net MVC - IExceptionFilter Implementasyonu İle Hata Yakalama

Asp.Net MVC Projelerinde IExceptionFilter adlı interface'in implemente edilmesi ve web projelerinde hata yakalama

10.03.2013

Yazar: H. Burak Tungut (Google+)

Kategori: ASP.NET MVC

4535

Herkese merhabalar. Yaklaşık 2 haftadır yazmayı hatta yazacağımda uygulamak istediğim senaryoyu bile kafamda tasarladığım makalem ile karşı karşıyayız cool Geçtiğimiz 3 ay boyunca MVC patterni üzerine yoğunlaşmama rağmen bu alanda makale paylaşımlarımın eksik olduğumu gözlemledim. Aslında amacım Asp.Net MVC için düzenli ilerleyecek bir yazı dizisi hazırlamaktı fakat bu alandaki ilk makalemin başlığı, “Asp.Net MVC - Arama Motoru Dostu linkler için Custom Link Senaryosu” şeklinde olunca giriş seviyesi konuları biraz atlamış oldum cheeky

C# ile Web Forms ya da MVC olsun herhangi biri ile web projesi geliştiren herkes eminim ki aşağıdaki manzara ile karşılaşmıştır;

“Kahretsin!! Evettt” diyenleri duyar gibiyim J Sarı arka plan üzerine kurulmuş şu sayfayı gördüğümüzde hiç şüphesiz işlerin ters gittiği kesindir. Birde son müşteri için hizmete açılmış bir projede böyle bir şeyin olduğunu hayal edelim. Ya da vazgeçtim. Hayal etmesek daha iyi gibi. Pekte güzel bir hayal olmadı blush Tabi ki bu hayali daha doğrusu kabusun yaşanmaması için bir şeylerin yapılması gerekir.

Senaryomuzu Tanıyalım

Aslında yapılması gereken olgu için ipucunu daha önce verdim (Bknz.: Makale Başlığı). Asp.Net MVC platformunun bizler için sunduğu çeşitli hata ayıklama mekanizmaları mevcut.  Aklıma gelenler için bunları şöyle sıralıyabiliriz;

1.       Application_Error metodunun yazılması

2.       IExceptionFilter interface’ini implemente eden bir filter yazılması

3.       IIS Custom Error kullanılması

Aklıma gelen bu üç yöntemden OOP tekniklerine daha yatkın olduğu için ikincisini tercih ettim.

Bugünkü senaryomuz olabildiğince basit. Elimizde bir web projesi var. Ana sayfasında ise sadece “Hata Fırlat” ismine sahip ve tıklandığında ise Exception fırlatacak bir link olsun. Tabi ki bu linke tıklandığında daha önce herhangi bir hata yakalama işlemi yapılmadığı için, yukarıda lanetler okuduğumuz sarı arka planları bir sayfa ile karşılaşıyor oluruz.

Projeyi uygulamaya geçirme işlemine, controller ve action’lardan başlayalım. Bunun için içi boş bir MVC projesi oluşturalım ve HomeController altına Index, Throw ve Error adlı üç adet ActionResult ekleyelim.  Index adlı ve Error adlı actionlar için birer view oluşturalım. Throw adlı action için herhangi bir view oluşturmayalım. Hata fırlatacak action’ın view ile ne işi olur laugh

HomeController Sınıfının Kodları

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Throw()
        {
            throw new Exception("Ben Fırlatırım, Sen Yakalarsın!");
        }

        public ActionResult Error()
        {
            return View();
        }
    }

Yukarıda bahsettiğimiz gibi Throw action'ının bir view'e bağlanması gereksizdir. Dikkat ederseniz herhangi bir return işlemide bu metot içerisinde uygulanmamıştır. Hatta Visual Studio varsa return sözcüğünün bizim için gereksiz olduğunuda söyleyecektir.[DEVAM]

Index Adlı View'in Kodları

@{
    ViewBag.Title = "Ana Sayfa";
}

<h2>Ana Sayfa</h2>
<a href="@Url.Action("Throw")">Hata Fırlat!</a>

Projemizi bu haliyle debug edelim ve hata fırlatılması için yukarıda oluşturduğumuz linke tıklayalım. Manzarayı tekrar tartışmaya gerek yok sanırım. Herhangi bir hata oluştuğunda kullanıcıya daha dost canlısı bir uyarı verdirmek içinde daha önce oluşturduğumuz Error result'ı için bir adet view ekleyelim.

Error Adlı View'in Kodları

@{
    ViewBag.Title = "Bir Hata Oluştu!";
}

<h2>Üzgünüm :( Bir Hata Oluştu!</h2>

Bir hata oluştuğunda son kullanıcıya yukarıdaki gibi bir sayfa yerine hatanın özkaynağınında bulunduğu bir sayfa gösterilmesi aynı zamanda bir güvenlik açığı oluşturacaktır.

Şimdi hata yakalam işlemine başlayalım. Bunun için öncelikle proje içerisinde ExceptionHandlerFilter adında bir sınıf oluşturup, IExceptionFilter interface'inden implemente edilmesini sağlayalım. İmplemente ettiğimiz bu arayüz içerisinde ezilmesini gerektiren ve adı OnException olan bir metot içerir. Biraz sonra üzerinde çalışacağımız bu metot parametre olarak ExceptionContext tipinde bir nesne taşır ve oluşan hata dahil, yönlendirme yapacağımız result alanlarının her birini içerisinde taşır.

ExceptionHandlerFilter Sınıfının Kodları

public class ExceptionHandlerFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            //Hata Loglandı
            //...
            filterContext.ExceptionHandled = true;
            var routeData = new RouteValueDictionary();
            routeData.Add("controller", "Home");
            routeData.Add("action", "Error");
            filterContext.Result = new RedirectToRouteResult(routeData);
        }
    }

Projemizde herhangi bir hata ile karşılaşıldığında tetiklenecek olan metot yukarıdaki gibidir. Bu metot içerisinde yapılacak en nadide işlemlerden biri hiç şüphesiz loglamadır. Makalemizdeki odak noktası bu filter'ın kullanımı olduğu için loglama işlemine değinmeden kaçı veriyoruz cheeky

Yaptığımızı varsaydığımız loglama işleminden sonra ise artık kullanıcıya bir hatanın oluştuğu bilidirilmelidir. Bunun için kullanıcının bulunduğu sayfa, yukarıda oluşturduğumuz Error view'ine bağlanmalıdır. Metot bu işlemi gerçekleştirebilmemiz için o anda execute edilmiş olan Result bilgisini filterContext adlı referans ile bize sunmaktadır. 

Gelen result bilgisi ne olursa olsun bir hata oluştuğu için yönlendirme yapılacaktır. Bu işlem için de RedirectToRouteResult adlı sınıf kullanılabilir. Bu yöntem ile yönlendirme yapılması için Route verilerininde girilmesi gereklidir. MVC'de bir route, execute işlemlerinin gerçekleştirilmesi için Controller ve Action bilgilerini mutlaka içermek zorundadır. Tabi ki route kurallarını değiştirmediysek smiley

Son olarak yazdığımız filter'ın application içerisinde aktifleşmesi için register olması gerekir. Bunun için Global.Asax'ın içindeki RegisterGlobalFilters metoduna aşağıdaki kod parçası eklenmelidir;

filters.Add(new ExceptionHandlerFilter());

Artık projemiz hataları yakalayarak, dost canlısı hata mesajları verebilecek hale geldi laugh Hata Fırlat linkine tıkandığında karşılaşmamız gereken yeni manzara aşağıdaki gibi olmalıdır;

 

Üzgünüm :( Bir Hata Oluştu!

 

Bir sonraki makalemde görüşmek üzere, herkese esenlikler dilerim :)
H.Burak TUNGUT

Yazar Hakkında

H. Burak Tungut

H. Burak Tungut

www.buraktungut.com

Lisans eğitimini Bilgisayar Mühendisliği üzerine tamamlamış ve yüksek lisansına İstanbul’da İşletme Yönetimi üzerine devam ettirmektedir. Şu anda mesleğini kurumsal bir firmada Yazılım Mimarı olarak sürdürmekte ve irili ufaklı bir çok açık kaynaklı projeyle daha uğraşmaktadır.

Sosyal Medya

ORANLAR

  • 4535izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...
  • Merhaba download linki çalışmıyor. Rica et...
  • Nevzat Bey selamlar, Açıkçası bizler a...
  • Parametreleri Cache İşleminden Yalıtma kon...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 120002
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 65047
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 48254
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ