none
Try Catch bloğunda hata yakalama RRS feed

  • Genel Tartışma

  • Herkese merhaba. c#ta Veri tabanına bilgi kaydederken hatalı durumlar için try catch bloğu kullanıyoruz. burada bir sorum olacak.

     try
                {
                     veritabanına kayır kodları;
                }
                catch (Exception mesaj)
                {

                    MessageBox.Show(mesaj.Message);
                }

    bu şekilde kullanınca sorun yok. Ancak sorum şu olacak. Burada catch bloğu içinde hata olursa veri tabanından gelen mesajı gösteriyor. Mesela birincil anahtara aynı kayıttan tekrar girilecek olursa;
    Tabloda yapılmasını istediğiniz değişiklikler, dizinde, birincil anahtarda veya ilişkilerde yinelenen değerler oluşturdukları için başarısız oldu. Yinelenen verileri içeren alan veya alanlardaki verileri değiştirin, dizini kaldırın veya dizini, yinelenen girdilere izin verecek şekilde yeniden tanımlayın ve yeniden deneyin.

    şeklide veri tabanına ait hata mesajı alıyorum. Kullanıcı için bu oldukça uzun ve anlaşılmaz bir mesaj. Bunu ben istediğim gibi değiştirip mesela; "Bu kayıt zaten var. Değiştirerek yeniden giriniz" gibi bir mesaj verebilir miyiz?

    Veri tabanına bağlanıp kaydı kontrol ederek veri tabanını boşa yormak istemiyorum. 

    6 Mart 2019 Çarşamba 19:27

Tüm Yanıtlar

  • Merhaba ,

    Hata yakalıyorsunuz ama Allah ne verdiyse yakalıyorsunuz :) bu hoş değil yani şimdi benim bilgisayarımın rami doldu yer kalmadı patladım patlıcam gelen hata mesajı bu kayıt zaten var olacak :) 

    Exception sınıfından türeyen bir sürü hata sınıfı var IOFileException atıyorum , bunu yakalarsınız mesaj kutusunda biz bu dosyayı açamadık dersiniz ama asıl hata mesajını da bir yere günü ve saatiyle birlikte yazarsınız (bir dosya yada veritabanı olabilir).Böylece hem kullanıcı ürkmez hemde olağan dışı bir durumda açar bakarsınız neymiş bu hata acaba diye.

    Ama bence Allah ne verdiyse yakalamayın yani :) bırakın fırlatsın hatayı :) 

    6 Mart 2019 Çarşamba 19:42
  • benim derdim hatayı kaydedip sonra ne hatalar alınmış bunlara bakmak değil ki. kullanıcıya daha anlaşılır hata mesajları vermek. Sizin tabirinizle uzun mesajlarla kullanıcıyı ürkütmek değil aksine anlayacağı hata haline getirmek. 

    Kullanıcı bir hata yaptı aynı kaydı tekrar yapmaya çalıştı. Mesela aynı e-postayı sadece bir kez yapsın istiyorum ve kullanıcı olaki unuttu ve  acb@def.com e-posta adresini tekrar kaydetmeye kalktı. İşte böyle durumda;

    Tabloda yapılmasını istediğiniz değişiklikler, dizinde, birincil anahtarda veya ilişkilerde yinelenen değerler oluşturdukları için başarısız oldu. Yinelenen verileri içeren alan veya alanlardaki verileri değiştirin, dizini kaldırın veya dizini, yinelenen girdilere izin verecek şekilde yeniden tanımlayın ve yeniden deneyin.

    hata mesajını görmesi ve anlamlandırmaya çalışması yerine kısaca Bu e-posta zaten kayıtlı diye mesaj verdirmek.

    6 Mart 2019 Çarşamba 19:56
  • Anlatamadım sanırım , 

    Şu aldığınız hatanın bir adı olmalı : Tabloda yapılmasını istediğiniz değişiklikler, dizinde, birincil anahtarda veya ilişkilerde yinelenen değerler oluşturdukları için başarısız oldu. Yinelenen verileri içeren alan veya alanlardaki verileri değiştirin, dizini kaldırın veya dizini, yinelenen girdilere izin verecek şekilde yeniden tanımlayın ve yeniden deneyin.

    Siz catch (Exception ) deyip Tüm hataların türediği Exception sınıfını alıyorsunuz yani bu durumda siz yukarıdaki hata mesajı gibi bir veritabanı hatası alabilirsiniz ama aynı şekilde OutOfMemory hatası da alabilirsiniz yani bu durumda siz ne hatası aldığınızı bilmeden nasıl Mesaj kutusunda Bu e-posta kayıtlı yazacaksınız ? 

    Ne yapmanız lazım ;

     catch(sqlexception ex) // işte burada sizin veritabanı ile ilgili bir hata aldığınızı biliyoruz şimdi ozaman ;

      //ex nesnesini tarih-saat bir yere not edin

       //kullanıcıya MesageBox.Show("Bu eposta kayıtlı "); mesajını yazdırın :) 

    6 Mart 2019 Çarşamba 20:04
  • Anlatamadım sanırım , 

    Şu aldığınız hatanın bir adı olmalı : Tabloda yapılmasını istediğiniz değişiklikler, dizinde, birincil anahtarda veya ilişkilerde yinelenen değerler oluşturdukları için başarısız oldu. Yinelenen verileri içeren alan veya alanlardaki verileri değiştirin, dizini kaldırın veya dizini, yinelenen girdilere izin verecek şekilde yeniden tanımlayın ve yeniden deneyin.

    Siz catch (Exception ) deyip Tüm hataların türediği Exception sınıfını alıyorsunuz yani bu durumda siz yukarıdaki hata mesajı gibi bir veritabanı hatası alabilirsiniz ama aynı şekilde OutOfMemory hatası da alabilirsiniz yani bu durumda siz ne hatası aldığınızı bilmeden nasıl Mesaj kutusunda Bu e-posta kayıtlı yazacaksınız ? 

    Ne yapmanız lazım ;

     catch(sqlexception ex) // işte burada sizin veritabanı ile ilgili bir hata aldığınızı biliyoruz şimdi ozaman ;

      //ex nesnesini tarih-saat bir yere not edin

       //kullanıcıya MesageBox.Show("Bu eposta kayıtlı "); mesajını yazdırın :) 

    sqlexception maalesef çıkmıyor. veritabanı için access kullanıyoruz. dahil etmem gereken başka bir kütüphane mi var acaba?

    Edit :

    if (mesaj.Message.StartsWith("tabloda yapılmasını istediğiniz değişiklikler") or mesaj.Message.StartsWith("The changes you requested"))
                    {
                        MessageBox.Show("Bu kullanıcı adı zaten var");
                    }

    yapınca halloldu şimdilik.


    • Düzenleyen acipinarli 6 Mart 2019 Çarşamba 20:29
    6 Mart 2019 Çarşamba 20:13
  • ..

    sqlexception maalesef çıkmıyor. veritabanı için access kullanıyoruz. dahil etmem gereken başka bir kütüphane mi var acaba?

          Bana yolladığınız hata mesajının başında Türediği sınıfıda yazar direkt onu yakalasanız çok daha iyi olur.

          Örneğin ; 

          
    System.IO.FileLoadException: Could not load file or assembly 'System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its 

         Burada FileLoadException'ı yakalamalısınız gibi...

         Ayrıca access ömür törpüsüdür başka bir şey kullanın ne olduğu fark etmez accessden iyi olduğu kesindir :) 

    6 Mart 2019 Çarşamba 20:29
  •      Ayrıca access ömür törpüsüdür başka bir şey kullanın ne olduğu fark etmez accessden iyi olduğu kesindir :) 

    evet orası kesin ama maalesef meb modülleri access olunca mecbur derste öyle kullanıyoruz. ilginiz için teşekkürler.

    Ayrıca hata kodunu almayı başardım şükür;

    catch (OleDbException mesaj) {
                    
                   if (mesaj.ErrorCode.ToString() == "-2147467259")
                   {
                       MessageBox.Show("Bu kullanıcı adı zaten var");
                   }

    • Düzenleyen acipinarli 6 Mart 2019 Çarşamba 20:52
    6 Mart 2019 Çarşamba 20:42