Her seferinde aslında yolu bir istisna ben merak hakkında ek bilgi sağlamak için gereken doğru Bunu yapmanın yolu.
Bu soru uğruna bir örnek yazdım. Varsayalım ki Abbreviation
özelliği güncellemek istediğimiz bir sınıf var . SOLID bakış açısından mükemmel olmayabilir, ancak işçi yöntemini DI üzerinden bir hizmetle geçsek bile aynı durum ortaya çıkar - bir istisna oluşur ve bunun için bir bağlam yoktur. Örneğe dön ...
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Abbreviation { get; set; }
}
Sonra sınıfın bazı örnekleri ve worker-method'un çağrıldığı bir döngü vardır. O atabilir StringTooShortException
.
var persons =
{
new Person { Id = 1, Name = "Fo" },
new Person { Id = 2, Name = "Barbaz" },
}
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
// ?
}
}
// throw AggregateException...
}
public IEnumerable<string> GenerateAbbreviation(string value)
{
if (value.Length < 5)
{
throw new StringTooShortException(value);
}
// generate abbreviation
}
Soru şudur: Person
veya Id
(veya başka bir şey) nasıl eklenir ?
Aşağıdaki üç tekniği biliyorum:
1 - Data
Mülkü kullanın
Artıları:
- kolay ek bilgi ayarlama
- daha fazla istisna oluşturmayı gerektirmez
- ek gerektirmez
try/catch
Eksileri:
- kolayca entegre edilemez
Message
- kaydediciler bu alanı yok sayar ve boşaltılamaz
- anahtarlar gerektirir ve döküm neden değerleri
object
- değişmez
Misal:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
ex.Data["PersonId"] = person.Id;
// collect ex
}
}
// throw AggregateException...
}
2 - Özel özellikleri kullanma
Artıları:
Data
mülke benzer ancak güçlü bir şekilde yazılmış- entegre etmek daha kolay
Message
Eksileri:
- özel istisnalar gerektirir
- Logger onları görmezden gelecek
- değişmez
Misal:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
// not suitable for this exception because
// it doesn't have anything in common with the Person
}
}
// throw AggregateException...
}
3 - İstisnayı başka bir istisna ile sarın
Artıları:
Message
öngörülebilir bir şekilde biçimlendirilebilir- kaydediciler iç istisnaları atar
- değişmez
Eksileri:
- ek gerektirir
try/catch
- Increses nesting
- istisnaların derinliğini arttırır
Misal:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
throw new InvalidPersonDataException(person.Id, ex);
}
}
catch(Exception ex)
{
// collect ex
}
}
// throw AggregateException...
}
- Başka kalıplar var mı?
- Daha iyi kalıplar var mı?
- Herhangi biri / hepsi için en iyi uygulamaları önerebilir misiniz?