Ana içeriğe geç

Başlarken

Bu döküman 3.1.0 sürümü için hazırlanmıştır.

Exception Handling

Hata yönetimidir. Yazılımcılar farklı türlerde, bir çok hata ile karşılaşabilirler. Önemli olan nokta karşılaştığımız hataları çözebilmek ve bu hataları kısa sürede doğru bir şekilde kontrol altına alabilmektir. Bir hata ile karşılaştığımızda bu hataların öncelikle ne tür bir hata olduğunu bilmemiz gerekmektedir. Hatalar kendi içerisinde gruplara ayrılır.

Programda bir syntax hatası olmamasına karşı, kullanıcının yanlış bilgi girmesi veya programcının kontrol altına almadığı bir durum sonucu karşılaşılan hatalardı. Bu tür hatalardan korunmak için kullanılan yapılar bulunmaktadır.

Mantıksal hatalar, tespit edilmesi en zor hata çeşitidir. Syntax olarak hata vermemekle birlikte, runtime hataları gibi programda bozukluğa sebep olmaz. Yazdığımız kodlar istediğimiz sonucu döndürmüyorsa Mantıksal bir hata ile karşı karşıya olabiliriz. Mantıksal hataları tespit etmek için Runtime sırasında kodlarımızı adım adım kontrol etmemiz gerekebilir.

Kurallar

  1. Exception varlığından hiçbir hata yükseltilmemelidir.
  2. AlpataHataKod dan türetilmiş hata yönetim sınıfı kullanılmalıdır.
  3. Her hatanın summary bilgisi hatayı açıklayıcı bir şekilde olmalıdır.
  4. Uyarı için kullanılan uygulamanın çalışmasına engel olmayan hatalar 500' ün altında bir ResposeCode almalıdır.
  5. Hata kodlarının açıklamaları projenin xml dosyasından okunduğu için tüm projelerin GenerateDocument özelliği açık olmalıdır.
  1. Api istekleri sonucunda oluşan hatalar global olarak yakalanmakta ve son kullanıcıya gösterilmektedir. Hataların doğru metinlerde gönderimi api tarafında yapılmalıdır. Api tarafındaki hata fırlatma standardına uyulmaması durumunda istenildiği gibi hatason kullanıcıya gösterilemez.
  2. tyr/cach blokları ile hata yakalanabilir ve yönetilebilir.
  3. Harici gösterilecek uyarılar için OctaPullNotifyService servisi kullılmalıdır. (Standart olarak tüm uyarılar bu servis üzerinden göseterilmektedir, gösterilmelidir.)

Kütüphane

Alpata uygulamalarında hata yönetimi için kullanılır. Tüm hataların (Exception) AlpataException'a dönüştürülmesini ve ilgili modül içerisine hata kodlarınız için yönetim nesnesini oluşturup kendi oluşturduğunuz hataların yçnetilmesini sağlar.

Yetenekler

  • Genel Kullanım olarak Exception sınıfından türetilmiş generic AlpataException sınıfını barındırır.
  • Hata kodlarını tekilleştirmek için AlpataHataCode tanımını içerir
  • MVC ve API projlerinde hata almak yerine HTTPStatus 500 alınması durumunda response body içerisinde kullanılmak üzere HttpAlpataHata modelini barındırır.
  • .NET Client projelerinde kullanılmak üzere hata alındığında response içerisindeki HttpAlpataHata bilgisinin parse edilmesi için kullanılacak ExceptionHelper eklentisini barındırır.

Kurulum

Paketi kullanmak istediğiniz projenize eklemek için:

dotnet add [PROJECT] package Alpata.Exception -v Latest -s GitHub
Source GitHub kullanılır. Bakınız [AlpataGithub]

npm install @alpata/octapull.core

Paket http://verdaccio.alpatateknoloji.com/ üzerinden çekilmelidir. Kurulumu için linki ziyaret ediniz.

Uygulama

Kullanacağımız yerde namespace ekli olmalıdır.

using Alpata.Exception;

Hatalarımızı herhangi bir gereksinime ihtiyaç duymadan kullanabiliriz. Herhangi bir hatanın yakalanıp dönüşümün sağlanabilmesi için try/catch bloklarından faydalanılır.

AlpataException generik bir varlık olduğu için sizlerden [AlpataHataKod] nesnesinden türetilmiş bir varlık isteyecektir. Varsayılan kullanımlarda direkt olacak AlpataHataKod nesnesi kullanılabilir.

try
{
    //Yapılan işlemeler
}
catch(Exception ex)
{
    //Hata olması durumunda hatanın yakalanması
    throw new AlpataException<AlpataHataKod>(ex);
}
finally
{
    //hata olsa da olmasa da son olarak çalıştırılacak işlemler
}

Almış olduğumuz hata spesifik olarak bir hataya dönüştürülmek istenir ise AlpataHataKod içerisindeki tanımlı hatalar yada AlpataHataKod dan türetilecek bir varlık yardımı ile kendi tanımlayacağız tipte hatalara dönüşümü sağlanabilir.

Aşağıdaki örnekte FileNotFoundException nın dönüştürülme örneğini bulabilirsiniz.

catch (FileNotFoundException ex)
{
    //Hata olması durumunda hatanın yakalanması
    throw new AlpataException<AlpataHataKod>(AlpataHataKod.FileNotFound, ex);
}

Yakalanması gereken hatalar haricinde sizlerde kendi kontrol ettiğiniz yerde hatalarınızı yükseltebilirsiniz. Bu kullanımda uygulama dosya örneği bulunamadığı durumda hata yükseltilmesi sağlanmıştır.

if (!assemblyFilename.StartsWith(prefix))
{
    throw new AlpataException<OwnHataKods>(new Exception("Assembly dosyası bulunamadı"));
}

Doğru olan kullanım örneği ise AlpataHataKod nesnesinden türetilmiş yada ilgili varlık içeirinde tanımlı olan hataların yükseltilmesidir. Burada ilgili hata kodu ataması sonrası hata içeriği, yardım linki vb. operasyonların otomatik olarak sağlanması ve dil desteği gibi işlemlerin rahatlıkla yapılmasına olanak sağlayacaktır.

if (!assemblyFilename.StartsWith(prefix))
{
    throw new AlpataException<AlpataHataKod>(AlpataHataKod.AssemblyFileNotFound);
}

=> Hata fırlatmak için bir özelleştirme bulunmamaktadır. Ancak son kullanıcıya uyarı gösterilmek isteniyorsa OctaPullNotifyService servisi kullanılmalıdır.

    constructor(
        private octaPullNotifyService: OctaPullNotifyService
    ) {}

    this.octaPullNotifyService.notifyGosterMixin(
        EIslemDurum.Uyari,
        'Lütfen izin verilen formatta dosya yükleyiniz.'
    );

Hata Kodlar

Yukarıdaki örnekler de AlpataHataKod varlığının AlpataException için bir zorunluluk olduğundan bahsetmiştik.

Şimdi AlpataHataKod aslında hata kodlarımızı tanımlamamıza olanak sağlayan bir varlık olarak kullanılacaktır.

Bu varlık içerisinde çok kullanılan hatalar tanımlanmış ve gereksinimlere göre tanımlanmaya devam edecektir. Ancak geliştirmelerin aksamaması ve her modülün kendine özgü hatalarının olabileceği düşünüldüğünde AlpataHataKod dan yeni bir hata yönetim varlığı oluşturabilirsiniz.

/// <summary>
/// Kendi hata kontrollerim
/// </summary>
public class OwnHataKods : AlpataHataKod
{
    /// <summary>
    /// Açıklama bulunamadı hatası
    /// </summary>
    [ExceptionInfo(System.Net.HttpStatusCode.InternalServerError)]
    public const int SummaryNotFound = 1001;
}

yukarıdaki örnekte görüldüğü gibi OwnHataKods nesnesi AlpataHataKod nesnesinden türetilmiştir. İçerisine SummaryNotFound hatası tanımlanmıştır. Bbu özelliğin yorumunda yazan açıklama hata yükseltildiğinde iletilecek hata açıklaması olacaktır. Aynı zamanda verilen numara hatanın ilgili modül içerisindeki özel hata numarasıdır. Moduller bazından unique olmalıdır.

Hatalarımızı oluştururken ExceptionInfo attribute den faylanmamız gerekir, bu attribute bir hata aldığımızda bu bir servis üzerinden response edilecek ise StatusKod olarak atama yapacağı kod bilgisini içerir

Dikkat

Hata kodları tekil olmaması durumunda ilk bulunan özelliğin hata açıklaması iletileceği için sonraki numaradaki açıkmalayı ezecektir.

Şimdi kendi tanımladığımız hata kodu varlığından hatamızı aşağıdaki gibi kullanabiliriz.

throw new AlpataException<OwnHataKods>(OwnHataKods.SummaryNotFound);

Başka bir hata yakaladığımızda dönüşümünü ise aşağıdaki gibi kullanabiliriz

catch (FileNotFoundException ex)
{
    //Hata olması durumunda hatanın yakalanması
    throw new AlpataException<OwnHataKods>(OwnHataKods.FileNotFound, ex);
}
Tanımlamamış olmamıza rağmen AlpataHataKod içerisindeki FileNotFound hatasını kullanmamıza engel hiçbir şey yoktur.

Genel Hata

Hata Kod Hata No Açıklama HttpStatusCode
FileNotFound 1000 Dosya bulunamadı. NoContent
AssemblyFileNotFound 1001 Projenin dosyası oluşturulmamış InternalServerError
EndpointNotFound 1002 Sunucuya erişim sağlanamadı. InternalServerError
CacheHatasi 2000 Cache de bulunamadı yada atama yapılamadı InternalServerError
KullaniciAdiveSifreHatasi 498 Kullanıcı adı ve şifresi yanlış girildi. Unauthorized
KullaniciDoğrulamaHatasi 499 Kullanıcı giriş hatasıdır. Unauthorized
KMailSunucusunaUlasilmiyor 512 Mail sunucusuna erişim sağlanamadı ServiceUnavailable
SunucuyaErisilemiyor 502 Servise yada sunucuya erişim sağlanamadı ServiceUnavailable
Unhandled 513 Yönetimi yapılmamış hata InternalServerError

API Response

Api üzerinden hatalar yönetildiğinde ilgili hata bilgisi response body içerisine yazılır. İlgili response body için HttpAlpataHata varlığı kullanılır.

İlgili varlığın tanımı aşağıdaki gibidir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/// <summary>
/// Hata mesajlarının clinte gönderimi için kullanılır
/// </summary>
public class HttpAlpataHata
{
    /// <summary>
    /// Hatanın yönetildiği kaynağın adı
    /// </summary>
    public string ErrorSource { get; set; } // Hata yönetiminde kullanılan AlpataHataKod dan türetilmiş nesnemizin yer bilgisi
    /// <summary>
    /// Tanımlanmış hata kodu
    /// </summary>
    /// <value></value>
    public int ErrorCode { get; set; } //Hatanın belirlenmiş kodu
    /// <summary>
    /// Tanımlanmış hata mesajı
    /// </summary>
    /// <value></value>
    public string Message { get; set; } //Hatanın summary bilgisi
    /// <summary>
    /// Hatanın alındığı web adresi
    /// </summary>
    /// <value></value>
    public string Uri { get; set; }
    /// <summary>
    /// Her hata için spesifik guid
    /// </summary>
    public Guid ErrorGuid { get; set; }
    /// <summary>
    /// Hata geri dönüşünde dönüşü yapılacak statu kodu
    /// </summary>
    /// <value></value>
    public HttpStatusCode StatusCode { get; set; } //Attribue de verilen statu kodu
    /// <summary>
    /// Hata için yardım adresi
    /// </summary>
    /// <value></value>
    public string HelpUri { get; set; }
    /// <summary>
    /// Kaynak hatanın mesajı
    /// </summary>
    /// <value></value>
    public string SourceMessage { get; set; }
}

=> Apiden gönderilen HttpAlpataHata nesnesi olduğu gibi FE e gelmektedir.

Kaynaklar

Hata yonetimi nedir ve hata yonetimi nasil yapilir

wikipedia