SORU
19 Mayıs 2009, Salı


Neden ve C bir istisna catch yeniden oluşturma#?

Makaleye bakıyorumC# - Data Transfer Objectseri hale getirilebilir DTOs.

Bu makalede, bu kod parçası içerir:

public static string SerializeDTO(DTO dto) {
    try {
        XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
        StringWriter sWriter = new StringWriter();
        xmlSer.Serialize(sWriter, dto);
        return sWriter.ToString();
    }
    catch(Exception ex) {
        throw ex;
    }
}

Bu makalenin geri kalanında mantıklı ve makul görünüyor (bir çaylak için), ama-catch-deneyin atmak bir WtfException atar...Bu tam olarak tüm özel durumları için eşdeğer değil mi?

Ergo:

public static string SerializeDTO(DTO dto) {
    XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
    StringWriter sWriter = new StringWriter();
    xmlSer.Serialize(sWriter, dto);
    return sWriter.ToString();
}

Falan C hata işleme hakkında temel kaçırdım#? Hemen hemen aynı gibi Java (eksi işaretli istisnalar), değil mi? ... Yani, her ikisi de rafine C .

Yığın Taşması soruThe difference between re-throwing parameter-less catch and not doing anything?try-catch-at benim iddiama destek gibi görünüyor-bir no-op.


DÜZENLEME:

Gelecekte bu konuyu bulur herkes için özetlemek gerekirse

YOK

try {
    // Do stuff that might throw an exception
}
catch (Exception e) {
    throw e; // This destroys the strack trace information!
}

Izleme bilgileri yığın sorunun kök nedeni tanımlamak için önemli olabilir.

YAPIN

try {
    // Do stuff that might throw an exception
}
catch (SqlException e) {
    // Log it
    if (e.ErrorCode != NO_ROW_ERROR) { // filter out NoDataFound.
        // Do special cleanup, like maybe closing the "dirty" database connection.
        throw; // This preserves the stack trace
    }
}
catch (IOException e) {
    // Log it
    throw;
}
catch (Exception e) {
    // Log it
    throw new DAOException("Excrement occurred", e); // wrapped & chained exceptions (just like java).
}
finally {
    // Normal clean goes here (like closing open files).
}

Daha az belirli bir öncekinden daha özel istisnalar (Java gibi) yakalamak.


Referanslar:

CEVAP
19 Mayıs 2009, Salı


İlk olarak; bu makaledeki kod yok bu yol kötü. throw ex stack bu ifade; bu durum aslında oluşturulduğu hakkında bilgi kaybetme atmak noktaya istisna çağrı sıfırlar.

İkinci olarak, eğer sadece yakalamak ve yeniden atmak gibi görüyorum hiçbir katma değer, kodu yukarıdaki örnek olacak kadar iyi (ya da verilen throw ex bit bile daha iyi) olmadan da try-catch.

Ancak, bir özel durum yakalamak ve yeniden oluşturma için isteyebilirsiniz durumlar vardır. Günlük onlardan biri olabilir:

try 
{
    // code that may throw exceptions    
}
catch(Exception ex) 
{
    // add error logging here
    throw;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • HereWeStayKings

    HereWeStayKi

    3 NİSAN 2013
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007