Bir istisna mesajı kaydedip farklı bir istisna atarsak hala bir antipattern mi?


18

Web uygulamamız ExceptionMapperbazı istisnaları eşlemek için bir kullanmaktadır Response. Aşağıdaki gibi yeni bir istisna atmadan önce istisna mesajlarını kaydediyoruz:

catch (SomeException ex) {
  LOG.error(ex.getMessage());
  throw new MyException(ex.getMessage());
}

Biz yeniden atma aynı istisna değil bu bir düşünülebilir eğer sorum şu yüzden, Log ve antipattern atın . Ve böylece, benzer yerlerde günlüğe kaydetmeyi kaldırmak ve ExceptionMapperaşağıdaki gibi birkaç sınıfa taşımak daha iyi olur :

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {

  // bla bla 

  @Override
  public Response toResponse(final MyException ex) {
    LOG.error(ex.getMessage());
    return Response.status(400).entity("something").build();
  }
}

3
Giriş yaptıktan sonra sizi durduracağım ex.getMessage(), bu zaten yanlış.
biziclop



IMO, bunun bir web hizmeti olduğunu belirtmemek gerçekten adil değil. Bu, oyun kurallarını gerçekten değiştirir, çünkü örneğin, sadece düzenli istisna işleme mekaniğini kullanmak bir güvenlik riski olabilir; herhangi bir istisnanın kontrol edilmesi ve filtrelenmesi gereken 500 hata yanıtında geri gönderilmesini istemezsiniz. Harici istemcilerin doğrudan çağırmasını sağlayan sistemlerle uğraşırken, olay yerinde agresif günlük kaydı çok daha yaygındır. Tekrar tekrar çağrılan servis çağrılarındaki günlük yığınları yönetilemez günlük dosyası boyutlarına ve performans sorunlarına yol açabilir.

@Gimby Bu durumda OP yanıtta herhangi bir hata bilgisi göndermez (muhtemelen bir ortak değer "hata oluştu" içeriği). Ayrıca, yığın izlemesi olmayan bir sorunu nasıl teşhis edersiniz? Yuvarlama günlükleri düzenli olarak depolama boyutuna dikkat eder ve günlük verileri büyük ölçüde sıkıştırılabilir.
Marko Topolnik

Yanıtlar:


36

Kodunuz aslında bir değil, üç farklı modelden oluşuyor:

  1. günlük ve yeniden değerlendirme;
  2. orijinal nedeni sarmadan tekrar yapın;
  3. yığın iletisini değil, yalnızca iletiyi günlüğe kaydet (bu en kötüsüdür).

Aşağıdakileri yapmak için en iyi uygulamayı izlediyseniz:

  1. hiç yakalamama (istisnanın kendi kendine yayılmasına izin ver);
  2. işaretli bir istisnayı yakalamak zorunda kalırsanız, işaretlenmemiş olarak sarın ve tekrar yapın;
  3. üst düzey dışında hiçbir şey kaydetmeyin;
  4. tüm istisna yığın izlemesini günlüğe kaydet log.error("Error occurred", e);

kaydedilen yığın izinin tüm sarılmış istisnaları da içereceğinden, geçerli olanınız da dahil olmak üzere herhangi bir ikilemle karşılaşmazsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.