Exception Handling - Custom Exception Oluşturma

Hata yönetimi yaparken hazır hata sınıflarını (built-in exception classes) görmüştük. Bu tip hatalar SystemException sınıfından türetilmiştir. Bu yazımda hata yönetimi yaparken kendi hata sınıfımızı oluşturup uygulamamızda kullanabileceğini anlatacağım.

Temel Nedenler
  • Kullanıcıya karmaşık hata mesajları göstermek yerine daha anlaşılır mesajlar göstermek
  • Hazır exception sınıflarının desteklemediği noktalarda uygulamanın akışına göre kendi hata sınıfını oluşturmak.
  • Daha kolay hata yönetimi ve bununla birlikte kod kalitesini arttırmak
ApplicationException sınıfını miras alarak kendi hata sınıflarımızı oluşturabiliriz.

Örnek bir senaryomuzda; bir kullanıcıdan 6 haneli bir kullanıcı adı istiyoruz ve bu kullanıcı adı harflerden oluşacaktır. İsteğimize uygun regular expression patternini kontrol eden bir metodumuz var ve eğer patterne uygun değilse hata mesajı fırlatsın.

İlk önce InvalidUserNameException sınıfı oluşturup ApplicationException sınfından miras alsın. Sınıfı oluşturduktan sonra gereken constructorlar oluşturulur. base kelimesi ile ApplicationException sınıfının özelliği alınmış olur.

 public class InvalidUserNameException : ApplicationException
    {
        public InvalidUserNameException() : base()
        {
             
        }


        public InvalidUserNameException(String name) : base(string.Format("Geçersiz Kullanıcı Adı:{0}", name))
        {
            this.HelpLink = "http://www.google.com";
        }

    }

Bu hata sınıfının kullanımında ise ValidateUserName metodunu oluşturarak kullanıcı adının desene uygun olup olmadığı belirtilir. Uygun değilse bu hata sınıfından nesne türeteceğiz.

        public static void ValidateUserName(string name)
        {
            Regex validateName = new Regex("^[A-Za-z]{6}$");

            if (!validateName.IsMatch(name))
                throw new InvalidUserNameException(name);
        }

        public static void Main(string[] args)
        {
            Console.WriteLine("Kullanıcı Adı:");
            string username = Console.ReadLine()    
            
            try
            {
                ValidateUserName(username);
                Console.WriteLine("Geçerli Kullanıcı Adı"); 
            }
            catch (InvalidUserNameException user)
            {
                Console.WriteLine(user.Message);
            }
            finally
            {
                Console.ReadKey();
            }
        }

Hatayı yakaladığımız catch alanında Message özelliği ile constructor'da yazdığımız mesajı döndürecektir.

Başka bir senaryomuzda; kullanıcı giriş işleminin kontrolü yapılıyor eğer kullanıcı adı ve şifre doğru değilse hata mesajı fırlatsın.

İlk önce LoginException sınıfı oluşturup ApplicationException sınıfından miras alsın. Sınıfı oluşturduktan sonra gereken constructorlar oluşturulur. base kelimesi ile ApplicationException sınıfının özelliği alınmış olur.

    public class LoginException : ApplicationException
    {
        public LoginException() : base()
        {
            this.HelpLink = "http://www.google.com";
        }

        public LoginException(String message) : base(message)
        {

        }
        public LoginException(String message, Exception InnerException) : base(message, InnerException)
        {

        }
    }

Bu hata sınıfının kullanımında ise kullanıcı adı ve şifre uyuşmazsa bu hata sınıfından nesne türeteceğiz.

        public static void Main(string[] args)
        {
            Console.WriteLine("Kullanıcı Adı:");
            string username = Console.ReadLine();
            Console.WriteLine("Şifre:");
            string password =Console.ReadLine();

            try
            {
                if (!(username=="mert" && password=="1234"))
                {
                   throw new LoginException("Hatalı Giriş");
                }
              
                Console.WriteLine("Giriş Başarılı");
                
            }
            
            catch (LoginException login)
            {
                Console.WriteLine(login.Message + " " + login.HelpLink);
            }
            
            finally
            {
                Console.ReadKey();
            }
        }

Hatayı yakaladığımız catch alanında ise Message özelliği ile constructor'da yazdığımız mesajımızı ve HelpLink özelliği ile constructor'da tanımladığımız sitenin linkini döndürecektir.

Temel olarak kendi hata sınıflarımızı oluşturabileceğimizi örneklerde gördük. Umarım faydalı olmuştur. :)

Yorumlar